Hootsuite API Nasıl Kullanılır?

Ashley Innocent

Ashley Innocent

25 March 2026

Hootsuite API Nasıl Kullanılır?

TL;DR

Hootsuite API, geliştiricilerin sosyal medya yönetim iş akışlarını programlı olarak entegre etmelerini sağlar. OAuth 2.0 kimlik doğrulamasını, profiller, gönderiler, analizler ve ekip yönetimi için RESTful uç noktalarını kullanır ve plana bağlı olarak dakikada 50-200 istek hız sınırlamalarına sahiptir. Bu kılavuz, kimlik doğrulama kurulumunu, gönderi planlamasını, analiz almayı, ekip yönetimini ve üretim entegrasyon stratejilerini kapsar.

Not: Hootsuite, 2024 itibarıyla genel API'sini kullanımdan kaldırmıştır. Bu kılavuz, Hootsuite'in iş ortağı entegrasyonları, webhook'lar ve benzer işlevsellik sağlayan üçüncü taraf sosyal medya yönetim API'leri dahil olmak üzere alternatif yaklaşımları kapsar.

Giriş

Hootsuite, 175'ten fazla ülkede 200.000'den fazla işletme için 30 milyondan fazla sosyal medya hesabını yönetmektedir. Sosyal medya araçları, pazarlama platformları veya analiz panoları oluşturan geliştiriciler için, bu devasa iş kitlesine ulaşmak amacıyla sosyal medya API entegrasyonu elzemdir.

Gerçek şu ki: 20'den fazla hesabı yöneten sosyal medya yöneticileri, manuel gönderim, etkileşim takibi ve rapor oluşturma için haftada 25-35 saat kaybediyor. Sağlam bir sosyal medya API entegrasyonu, içerik dağıtımını, etkileşim izlemeyi, duygu analizini ve performans raporlamasını otomatikleştirir.

düğme

Hootsuite API Durumu ve Alternatifler

Mevcut API Durumu

2024 itibarıyla Hootsuite, genel API'sini kullanımdan kaldırmıştır. Entegrasyon seçenekleri:

Yaklaşım Açıklama En İyi Kullanım Alanı
Yerel Platform API'leri Facebook, Twitter, LinkedIn vb. ile doğrudan entegrasyon. Tam kontrol, özel çözümler
Audiense Hootsuite'e ait hedef kitle zekası Hedef kitle analizi
HeyOrca Sosyal medya planlama API'si İçerik takvimleri
Buffer API Sosyal medya yönetimi Küçük ekipler
Sprout Social API Kurumsal sosyal medya yönetimi Büyük kuruluşlar
Agorapulse API Sosyal medya CRM'i Topluluk yönetimi

Önerilen Yaklaşım: Yerel Platform API'leri

Çoğu kullanım durumu için, sosyal platformlarla doğrudan entegrasyon en fazla esnekliği sağlar:

Platform API Adı Temel Özellikler
Facebook/Instagram Graph API Gönderiler, istatistikler, yorumlar
Twitter/X API v2 Tweetler, analizler, akışlar
LinkedIn Pazarlama API'si Gönderiler, şirket sayfaları, reklamlar
Pinterest API v5 Pinler, panolar, analizler
TikTok Display API Videolar, kullanıcı bilgileri
YouTube Data API Videolar, oynatma listeleri, analizler

Başlarken: Çoklu Platform Kimlik Doğrulaması

Adım 1: Geliştirici Uygulamalarını Kaydedin

Her platform için geliştirici hesapları oluşturun:

// Kimlik bilgilerini güvenli bir şekilde saklayın
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, // Facebook Girişi kullanır
    appSecret: process.env.FB_APP_SECRET
  }
};

Adım 2: OAuth 2.0 Akışını Uygulayın

Birden fazla platform için birleştirilmiş OAuth işleyicisi:

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()}`;
};

// OAuth geri çağrısını işleyin
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();
};

Adım 3: Tokenleri Güvenli Bir Şekilde Saklayın

// Sosyal tokenler için veritabanı şeması
const SocialToken = {
  userId: 'user_123',
  platform: 'facebook',
  accessToken: 'encrypted_token_here',
  refreshToken: 'encrypted_refresh_token',
  tokenExpiry: Date.now() + 5183999, // 60 gün
  scopes: ['pages_manage_posts', 'pages_read_engagement'],
  pageId: 'page_456', // Facebook/Instagram için
  pageName: 'My Business Page'
};

Gönderi Planlama ve Yayınlama

Çoklu Platform Gönderisi Oluşturma

Birden fazla platformda aynı anda yayınlayın:

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

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

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

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

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

  return results;
};

// Facebook gönderimi
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();
};

// Twitter gönderimi
const postToTwitter = async (postData) => {
  const token = await getTwitterToken();

  let mediaIds = [];
  if (postData.media) {
    // Önce medyayı yükleyin
    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();
};

// LinkedIn gönderimi
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();
};

// Instagram gönderimi
const postToInstagram = async (postData) => {
  const token = await getInstagramToken();

  // Adım 1: Medya kapsayıcısı oluştur
  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();

  // Adım 2: Yayınla
  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();
};

Gönderi Planlama

Gönderi planlamasını uygulayın:

const schedulePost = async (postData, scheduledTime) => {
  // Daha sonraki yürütme için veritabanına kaydet
  const scheduledPost = await db.scheduledPosts.create({
    message: postData.message,
    platforms: postData.platforms,
    scheduledTime: scheduledTime,
    status: 'pending',
    media: postData.media,
    link: postData.link
  });

  // İş kuyruğunu ayarla
  await jobQueue.add('publish-social-post', {
    postId: scheduledPost.id
  }, {
    delay: scheduledTime - Date.now()
  });

  return scheduledPost;
};

// İş işlemcisi
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;
  }
});

Analiz ve Raporlama

Platformlar Arası Analizleri Getirme

Tüm platformlardan metrikleri birleştirin:

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)
  };

  // Metrikleri birleştir
  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 };
};

// Facebook İstatistikleri
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();
};

// Twitter Analizleri
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();
};

// LinkedIn Analizleri
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();
};

// Instagram İstatistikleri
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);
}

Ekip Yönetimi

Rol Tabanlı Erişim Kontrolü

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);
};

Hız Sınırlama

Platform Hız Sınırları

Platform Sınır Pencere
Facebook Graph 200 çağrı Kullanıcı başına saatlik
Twitter API v2 300 tweet 15 dakikada bir
LinkedIn 100-500 çağrı Günlük
Instagram 200 çağrı Saatlik

Hız Sınırlama İşlemlerini Uygulama

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++;
  }
}

Üretim Ortamına Dağıtım Kontrol Listesi

Canlıya geçmeden önce:

Gerçek Dünya Kullanım Durumları

Sosyal Medya Panosu

Bir pazarlama ajansı birleşik bir pano oluşturur:

Otomatik İçerik Dağıtımı

Bir yayıncı makale paylaşımını otomatikleştirir:

Sonuç

Hootsuite'in genel API'si kullanımdan kaldırılmış olsa da, yerel platform API'leri kapsamlı sosyal medya yönetimi yetenekleri sunar. Temel çıkarımlar:

düğme

SSS Bölümü

Hootsuite'in hala bir API'si var mı?

Hootsuite, 2024 yılında genel API'sini kullanımdan kaldırdı. Yerel platform API'lerini veya Buffer, Sprout Social veya Agorapulse gibi alternatif yönetim platformlarını kullanın.

Birden fazla platforma aynı anda nasıl gönderi yaparım?

Her platform için OAuth uygulayın ve her platformun API'sini paralel olarak çağıran bir birleşik gönderi işlevi oluşturun.

Sosyal medya API'leri için hız sınırları nelerdir?

Sınırlar değişir: Facebook (200/saat), Twitter (300/15dk), LinkedIn (100-500/gün), Instagram (200/saat).

Gönderileri nasıl planlarım?

Gönderileri scheduled_time ile bir veritabanında saklayın, ardından planlanan zamanda yayınlamak için bir iş kuyruğu (Bull, Agenda) kullanın.

Tüm platformlardan analiz alabilir miyim?

Evet, her platform analiz API'leri sağlar. Platformlar arası raporlama için verileri birleştirin.

API Tasarım-Öncelikli Yaklaşımı Apidog'da Uygulayın

API'leri oluşturmanın ve kullanmanın daha kolay yolunu keşfedin