Cara Menggunakan Instagram Graph API di Tahun 2026

Ashley Innocent

Ashley Innocent

25 March 2026

Cara Menggunakan Instagram Graph API di Tahun 2026

Apidog untuk Perusahaan

Penerapan On-Premises

SSO & RBAC

Sesuai SOC 2

Jelajahi Apidog Enterprise

TL;DR

Instagram Graph API memungkinkan pengembang untuk mengelola akun Instagram Bisnis dan Kreator secara terprogram. Ini menggunakan autentikasi Facebook Login OAuth 2.0, endpoint berbasis GraphQL untuk publikasi konten, wawasan, komentar, dan pesan, dengan batasan laju 200 panggilan per jam per aplikasi. Panduan ini mencakup pengaturan autentikasi, publikasi konten, pengambilan wawasan, manajemen komentar, dan strategi integrasi produksi.

Pendahuluan

Instagram memiliki lebih dari 2 miliar pengguna aktif bulanan, dengan lebih dari 200 juta bisnis menggunakan akun Instagram Bisnis. Bagi pengembang yang membangun alat manajemen media sosial, platform analitik, atau integrasi e-commerce, integrasi Instagram Graph API sangat penting untuk menjangkau audiens yang masif ini.

Inilah kenyataannya: manajer media sosial yang menangani 10+ akun kehilangan 20-30 jam setiap minggunya untuk posting manual, respons komentar, dan kompilasi analitik. Integrasi API Instagram yang solid mengotomatiskan publikasi konten, moderasi komentar, analisis sentimen, dan pelaporan kinerja.

Panduan ini akan membahas proses integrasi Instagram Graph API secara lengkap. Anda akan mempelajari autentikasi Facebook Login, publikasi konten, wawasan media, manajemen komentar, integrasi webhook, dan strategi penerapan produksi. Pada akhirnya, Anda akan memiliki integrasi Instagram yang siap produksi.

💡
Apidog menyederhanakan pengujian integrasi API. Uji endpoint Instagram Anda, validasi alur OAuth, periksa respons API, dan debug masalah publikasi dalam satu ruang kerja. Impor spesifikasi API, respons tiruan, dan bagikan skenario pengujian dengan tim Anda.
tombol

Apa itu Instagram Graph API?

Instagram Graph API menyediakan akses terprogram ke akun Instagram Bisnis dan Kreator melalui Facebook Graph API. API menangani:

Fitur Utama

Fitur Deskripsi
API Berbasis Graf Akses sumber daya berbasis node
OAuth 2.0 Autentikasi Facebook Login
Webhook Notifikasi waktu nyata untuk komentar, penyebutan
Pembatasan Laju 200 panggilan per jam per aplikasi
Publikasi Konten Foto, video, reels, korsel
Wawasan Metrik keterlibatan, jangkauan, tayangan
Moderasi Manajemen komentar, penyebutan, pesan

Persyaratan Akun

Tipe Akun Akses API
Akun Bisnis Akses API penuh
Akun Kreator Akses API penuh
Akun Pribadi Tidak ada akses API (harus dikonversi)
Akun Privat Wawasan terbatas

Ikhtisar Arsitektur API

Instagram menggunakan struktur Facebook Graph API:

https://graph.facebook.com/v18.0/

Perbandingan Versi API

Versi Status Tanggal Berakhir Kasus Penggunaan
v18.0 Saat Ini Maret 2026 Semua integrasi baru
v17.0 Usang Januari 2026 Integrasi yang ada
v16.0 Tidak Digunakan Lagi Kedaluwarsa Jangan gunakan

Facebook merilis versi baru setiap kuartal. Selalu targetkan versi stabil terbaru.

Memulai: Pengaturan Autentikasi

Langkah 1: Buat Akun Pengembang Facebook

Sebelum mengakses API:

  1. Kunjungi Portal Pengembang Facebook
  2. Masuk dengan akun Facebook
  3. Buat Aplikasi Facebook (tipe: Bisnis)
  4. Tambahkan produk Instagram Graph API

Langkah 2: Tautkan Akun Instagram Bisnis

Hubungkan Instagram ke Halaman Facebook:

  1. Buka Pengaturan Halaman Facebook > Instagram
  2. Klik Hubungkan Akun
  3. Masuk ke Instagram dan otorisasi
  4. Konfirmasikan akun Instagram Bisnis telah tertaut

Catatan: Akun Instagram pribadi tidak dapat menggunakan Graph API. Konversi ke akun Bisnis atau Kreator di Pengaturan Instagram.

Langkah 3: Dapatkan Token Akses

Hasilkan Token Akses Pengguna:

const FB_APP_ID = process.env.FB_APP_ID;
const FB_APP_SECRET = process.env.FB_APP_SECRET;
const FB_REDIRECT_URI = process.env.FB_REDIRECT_URI;

// Build authorization URL
const getAuthUrl = (state) => {
  const params = new URLSearchParams({
    client_id: FB_APP_ID,
    redirect_uri: FB_REDIRECT_URI,
    scope: 'instagram_basic,instagram_content_publish,instagram_manage_comments,instagram_manage_insights,pages_read_engagement',
    state: state
  });

  return `https://www.facebook.com/v18.0/dialog/oauth?${params.toString()}`;
};

Izin yang Diperlukan

Izin Deskripsi
instagram_basic Info profil dasar, daftar media
instagram_content_publish Publikasikan foto, video, korsel
instagram_manage_comments Baca/tulis komentar
instagram_manage_insights Akses data analitik
pages_read_engagement Akses halaman untuk publikasi
pages_manage_posts Publikasikan ke Halaman yang terhubung

Langkah 4: Tukarkan Token untuk Token Berjangka Panjang

Token berjangka pendek kedaluwarsa dalam 1 jam. Tukarkan dengan token berjangka panjang (60 hari):

const exchangeForLongLivedToken = async (shortLivedToken) => {
  const response = await fetch(
    `https://graph.facebook.com/v18.0/oauth/access_token?` +
    `grant_type=fb_exchange_token&` +
    `client_id=${FB_APP_ID}&` +
    `client_secret=${FB_APP_SECRET}&` +
    `fb_exchange_token=${shortLivedToken}`
  );

  const data = await response.json();
  return data;
};

// Usage
const longLivedToken = await exchangeForLongLivedToken(shortLivedToken);
console.log(`Token expires: ${new Date(longLivedToken.expires_at * 1000)}`);

Langkah 5: Dapatkan ID Akun Instagram Bisnis

Ambil akun Instagram yang terhubung:

const getInstagramAccountId = async (pageId, accessToken) => {
  const response = await fetch(
    `https://graph.facebook.com/v18.0/${pageId}?fields=instagram_business_account&access_token=${accessToken}`
  );

  const data = await response.json();
  return data.instagram_business_account.id;
};

// Usage
const igAccountId = await getInstagramAccountId('12345678', accessToken);
console.log(`Instagram Account ID: ${igAccountId}`);

Langkah 6: Lakukan Panggilan API Terautentikasi

Buat klien API yang dapat digunakan kembali:

const IG_BASE_URL = 'https://graph.facebook.com/v18.0';

const instagramRequest = async (endpoint, params = {}) => {
  const url = new URL(`${IG_BASE_URL}${endpoint}`);
  url.searchParams.append('access_token', process.env.INSTAGRAM_ACCESS_TOKEN);

  Object.entries(params).forEach(([key, value]) => {
    url.searchParams.append(key, value);
  });

  const response = await fetch(url.toString());

  if (!response.ok) {
    const error = await response.json();
    throw new Error(`Instagram API Error: ${error.error.message}`);
  }

  return response.json();
};

// Usage
const account = await instagramRequest(`/me`);
console.log(`Instagram Account: ${account.username}`);

Publikasi Konten

Mempublikasikan Foto

Posting foto ke Instagram:

const publishPhoto = async (igAccountId, photoData) => {
  // Step 1: Create media container
  const containerResponse = await instagramRequest(`/${igAccountId}/media`, {
    method: 'POST',
    image_url: photoData.imageUrl,
    caption: photoData.caption,
    location_id: photoData.locationId, // Optional
    is_carousel_item: 'false'
  });

  const creationId = containerResponse.id;

  // Step 2: Publish the media
  const publishResponse = await instagramRequest(`/${igAccountId}/media_publish`, {
    method: 'POST',
    creation_id: creationId
  });

  return publishResponse;
};

// Usage
const post = await publishPhoto({
  igAccountId: '17841400000000000',
  imageUrl: 'https://example.com/image.jpg',
  caption: 'Excited to announce our new product! 🚀 #launch #innovation',
  locationId: '123456789' // Optional
});

console.log(`Published media ID: ${post.id}`);

Mempublikasikan Video

Posting video ke Instagram:

const publishVideo = async (igAccountId, videoData) => {
  // Step 1: Create media container
  const containerResponse = await instagramRequest(`/${igAccountId}/media`, {
    method: 'POST',
    video_url: videoData.videoUrl,
    cover_url: videoData.coverUrl, // Optional thumbnail
    caption: videoData.caption,
    media_type: 'REELS', // or 'VIDEO' for feed
    share_to_feed: 'true' // For reels
  });

  const creationId = containerResponse.id;

  // Wait for video processing (poll until status is EXPIRED or FINISHED)
  await waitForVideoProcessing(creationId);

  // Step 2: Publish the media
  const publishResponse = await instagramRequest(`/${igAccountId}/media_publish`, {
    method: 'POST',
    creation_id: creationId
  });

  return publishResponse;
};

const waitForVideoProcessing = async (creationId, maxAttempts = 30) => {
  for (let i = 0; i < maxAttempts; i++) {
    const status = await instagramRequest(`/${creationId}`);

    if (status.status_code === 'FINISHED') {
      return true;
    } else if (status.status_code === 'EXPIRED') {
      throw new Error('Video processing expired');
    }

    await new Promise(resolve => setTimeout(resolve, 2000));
  }

  throw new Error('Video processing timeout');
};

Mempublikasikan Korsel (Beberapa Gambar/Video)

Posting beberapa item media dalam satu postingan:

const publishCarousel = async (igAccountId, carouselData) => {
  const children = [];

  // Step 1: Create each carousel item
  for (const item of carouselData.items) {
    const containerResponse = await instagramRequest(`/${igAccountId}/media`, {
      method: 'POST',
      [item.type === 'video' ? 'video_url' : 'image_url']: item.url,
      caption: item.caption || '',
      is_carousel_item: 'true'
    });

    children.push(containerResponse.id);
  }

  // Step 2: Create carousel container with children
  const carouselContainerResponse = await instagramRequest(`/${igAccountId}/media`, {
    method: 'POST',
    media_type: 'CAROUSEL',
    children: children.join(','),
    caption: carouselData.caption
  });

  const creationId = carouselContainerResponse.id;

  // Step 3: Publish the carousel
  const publishResponse = await instagramRequest(`/${igAccountId}/media_publish`, {
    method: 'POST',
    creation_id: creationId
  });

  return publishResponse;
};

// Usage
const carousel = await publishCarousel('17841400000000000', {
  caption: 'Product showcase 2026',
  items: [
    { type: 'image', url: 'https://example.com/img1.jpg', caption: 'Product 1' },
    { type: 'image', url: 'https://example.com/img2.jpg', caption: 'Product 2' },
    { type: 'video', url: 'https://example.com/vid1.mp4', caption: 'Demo' }
  ]
});

Tipe Media

Tipe Media Parameter Kasus Penggunaan
IMAGE image_url, keterangan Postingan foto
VIDEO video_url, cover_url, keterangan Postingan video
REELS video_url, cover_url, keterangan, share_to_feed Reels
CAROUSEL children (array), keterangan Beberapa media

Mengambil Media dan Wawasan

Mendapatkan Media Pengguna

Ambil media yang dipublikasikan:

const getUserMedia = async (igAccountId, limit = 25) => {
  const response = await instagramRequest(`/${igAccountId}/media`, {
    fields: 'id,caption,media_type,media_url,permalink,timestamp,like_count,comments_count',
    limit: limit.toString()
  });

  return response;
};

// Usage
const media = await getUserMedia('17841400000000000');
media.data.forEach(item => {
  console.log(`${item.media_type}: ${item.caption}`);
  console.log(`Likes: ${item.like_count}, Comments: ${item.comments_count}`);
  console.log(`URL: ${item.permalink}`);
});

Mendapatkan Wawasan Media

Ambil analitik untuk media tertentu:

const getMediaInsights = async (mediaId) => {
  const response = await instagramRequest(`/${mediaId}/insights`, {
    fields: 'impressions,reach,engagement,saved,video_views,profile_visits,follows'
  });

  return response;
};

// Usage
const insights = await getMediaInsights('17890000000000000');
insights.data.forEach(metric => {
  console.log(`${metric.name}: ${metric.values[0].value}`);
});

Metrik Wawasan yang Tersedia

Metrik Deskripsi Tipe Media
impressions Total tayangan Semua
reach Akun unik yang dijangkau Semua
engagement Suka + komentar + simpan Semua
saved Kali disimpan Semua
video_views Tayangan video (3+ detik) Video, Reels
plays Total putar video Video, Reels
profile_visits Kunjungan profil dari postingan Semua
follows Pengikut dari postingan Semua
comments Jumlah komentar Semua
like_count Jumlah suka Semua

Mendapatkan Wawasan Akun

Ambil analitik akun secara agregat:

const getAccountInsights = async (igAccountId, metricNames, since = null, until = null) => {
  const params = {
    metric: metricNames.join(','),
    period: 'day'
  };

  if (since) params.since = since;
  if (until) params.until = until;

  const response = await instagramRequest(`/${igAccountId}/insights`, params);

  return response;
};

// Usage - Get last 30 days of metrics
const accountInsights = await getAccountInsights(
  '17841400000000000',
  ['impressions', 'reach', 'profile_views', 'email_contacts', 'website_clicks'],
  '2026-02-23',
  '2026-03-25'
);

accountInsights.data.forEach(metric => {
  console.log(`${metric.name}:`);
  metric.values.forEach(value => {
    console.log(`  ${value.end_time}: ${value.value}`);
  });
});

Metrik Tingkat Akun

Metrik Deskripsi
impressions Total tayangan profil + konten
reach Akun unik yang dijangkau
profile_views Kunjungan profil
website_clicks Klik tautan di bio
email_contacts Ketukan tombol email
phone_call_clicks Ketukan tombol telepon
text_message_clicks Ketukan tombol SMS
get_directions_clicks Klik alamat
follower_count Total pengikut
audience_city Kota pengikut
audience_country Negara pengikut
audience_gender_age Rincian demografi

Manajemen Komentar

Mendapatkan Komentar

Ambil komentar pada media:

const getMediaComments = async (mediaId, limit = 50) => {
  const response = await instagramRequest(`/${mediaId}/comments`, {
    fields: 'id,text,timestamp,username,hidden',
    limit: limit.toString()
  });

  return response;
};

// Usage
const comments = await getMediaComments('17890000000000000');
comments.data.forEach(comment => {
  console.log(`@${comment.username}: ${comment.text}`);
  console.log(`Hidden: ${comment.hidden}`);
});

Membalas Komentar

Posting balasan untuk komentar:

const replyToComment = async (mediaId, commentId, replyText) => {
  const response = await instagramRequest(`/${mediaId}/comments`, {
    method: 'POST',
    response_to: commentId,
    message: replyText
  });

  return response;
};

// Usage
const reply = await replyToComment(
  '17890000000000000',
  '17900000000000000',
  'Thank you for your interest! Check your DM for details.'
);
console.log(`Reply posted: ${reply.id}`);

Menyembunyikan Komentar

Sembunyikan komentar yang tidak pantas:

const hideComment = async (commentId) => {
  const response = await instagramRequest(`/${commentId}`, {
    method: 'POST',
    hide: 'true'
  });

  return response;
};

// Usage
await hideComment('17900000000000000');
console.log('Comment hidden');

Menghapus Komentar

Hapus komentar spam atau tidak pantas:

const deleteComment = async (commentId) => {
  await instagramRequest(`/${commentId}`, {
    method: 'DELETE'
  });

  console.log('Comment deleted');
};

Webhook

Mengkonfigurasi Webhook

Siapkan webhook untuk notifikasi waktu nyata:

const subscribeToWebhooks = async (appId, pageId, accessToken) => {
  // Subscribe to Instagram events
  const response = await fetch(
    `https://graph.facebook.com/v18.0/${appId}/subscriptions`,
    {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({
        object: 'instagram',
        callback_url: 'https://myapp.com/webhooks/instagram',
        verify_token: process.env.WEBHOOK_VERIFY_TOKEN,
        access_token: accessToken,
        fields: ['comments', 'mentions', 'message_reactions']
      })
    }
  );

  return response.json();
};

Menangani Webhook

const express = require('express');
const app = express();

// Verify webhook subscription
app.get('/webhooks/instagram', (req, res) => {
  const mode = req.query['hub.mode'];
  const token = req.query['hub.verify_token'];
  const challenge = req.query['hub.challenge'];

  if (mode === 'subscribe' && token === process.env.WEBHOOK_VERIFY_TOKEN) {
    console.log('Webhook verified');
    res.status(200).send(challenge);
  } else {
    res.status(403).send('Verification failed');
  }
});

// Handle webhook events
app.post('/webhooks/instagram', express.json(), async (req, res) => {
  const body = req.body;

  if (body.object !== 'instagram') {
    return res.status(404).send('Not found');
  }

  for (const entry of body.entry) {
    const igId = entry.id;
    const changes = entry.changes;

    for (const change of changes) {
      switch (change.field) {
        case 'comments':
          await handleNewComment(change.value);
          break;
        case 'mentions':
          await handleMention(change.value);
          break;
        case 'message_reactions':
          await handleReaction(change.value);
          break;
      }
    }
  }

  res.status(200).send('OK');
});

async function handleNewComment(data) {
  console.log(`New comment on media ${data.media_id}`);
  console.log(`From: ${data.from_id}`);
  console.log(`Text: ${data.text}`);

  // Balas otomatis atau moderasi
  if (isSpam(data.text)) {
    await hideComment(data.id);
  }
}

Bidang Webhook

Bidang Pemicu
comments Komentar atau balasan baru
mentions Pengguna menyebut akun
message_reactions Reaksi terhadap cerita
story_status Balasan/tayangan cerita

Pembatasan Laju

Memahami Pembatasan Laju

Instagram Graph API memberlakukan:

Melebihi batasan akan menghasilkan HTTP 400 dengan subkode kesalahan 613.

Praktik Terbaik Pembatasan Laju

  1. Cache respons - Jangan mengambil ulang data yang tidak berubah
  2. Permintaan batch - Gunakan ekspansi bidang untuk mengurangi panggilan
  3. Gunakan webhook - Pembaruan waktu nyata alih-alih polling
  4. Terapkan backoff - Backoff eksponensial pada kesalahan 429
const makeRateLimitedRequest = async (endpoint, params = {}, maxRetries = 3) => {
  for (let attempt = 1; attempt <= maxRetries; attempt++) {
    try {
      const response = await instagramRequest(endpoint, params);
      return response;
    } catch (error) {
      if (error.message.includes('429') && attempt < maxRetries) {
        const delay = Math.pow(2, attempt) * 1000;
        console.log(`Dibatasi laju. Mencoba lagi dalam ${delay}md...`);
        await new Promise(resolve => setTimeout(resolve, delay));
      } else {
        throw error;
      }
    }
  }
};

Pemecahan Masalah Umum

Masalah: Token OAuth Kedaluwarsa

Gejala: Mendapatkan kesalahan “Invalid OAuth access token”.

Solusi:

  1. Terapkan penyegaran token sebelum kedaluwarsa 60 hari
  2. Simpan tanggal kedaluwarsa token dan beri peringatan sebelum kedaluwarsa
  3. Autentikasi ulang pengguna jika token kedaluwarsa

Masalah: Publikasi Media Gagal

Gejala: Publikasi mengembalikan kesalahan.

Solusi:

  1. Verifikasi URL gambar dapat diakses secara publik (tidak memerlukan autentikasi)
  2. Periksa format gambar (JPEG, PNG) dan ukuran (<8MB)
  3. Pastikan video berformat MP4, <1GB, <90 detik
  4. Tunggu pemrosesan video sebelum mempublikasikan

Masalah: Wawasan Tidak Tersedia

Gejala: API Wawasan mengembalikan data kosong.

Solusi:

  1. Verifikasi akun adalah Bisnis atau Kreator (bukan Pribadi)
  2. Tunggu 24-48 jam hingga wawasan terisi
  3. Periksa apakah akun memiliki aktivitas yang cukup

Daftar Periksa Penerapan Produksi

Sebelum tayang:


Kasus Penggunaan Dunia Nyata

Alat Penjadwalan Media Sosial

Sebuah platform pemasaran mengotomatiskan postingan:

Implementasi kunci:

Otomatisasi Layanan Pelanggan

Sebuah merek e-commerce mengotomatiskan respons komentar:

Implementasi kunci:

Kesimpulan

Instagram Graph API menyediakan akses komprehensif ke fitur akun Instagram Bisnis dan Kreator. Poin-poin penting:

tombol

Bagian FAQ

Bagaimana cara mendapatkan akses ke Instagram API?

Buat akun Pengembang Facebook, buat aplikasi Bisnis, tambahkan produk Instagram Graph API, dan autentikasi melalui Facebook Login dengan izin yang diperlukan.

Bisakah saya memposting ke Instagram secara otomatis?

Ya, gunakan Content Publishing API untuk mempublikasikan foto, video, reels, dan korsel ke akun Bisnis dan Kreator.

Jenis akun Instagram apa yang mendukung API?

Hanya akun Bisnis dan Kreator yang memiliki akses API penuh. Akun pribadi memiliki akses API terbatas atau tidak sama sekali.

Bagaimana cara mendapatkan komentar dari Instagram?

Gunakan endpoint Komentar (/{media-id}/comments) untuk mengambil komentar pada media tertentu. Webhook menyediakan notifikasi waktu nyata.

Apa saja batasan laju Instagram?

Instagram Graph API mengizinkan 200 panggilan per jam per aplikasi. Beberapa endpoint memiliki batasan per pengguna tambahan.

Bisakah saya mempublikasikan Cerita melalui API?

Ya, Cerita dapat dipublikasikan menggunakan alur publikasi konten yang sama dengan postingan feed.

Bagaimana cara mengakses Instagram Insights?

Minta izin instagram_manage_insights selama OAuth. Gunakan endpoint Wawasan untuk mengambil metrik untuk media dan akun.

Bisakah saya membalas komentar secara otomatis?

Ya, gunakan API Komentar untuk memposting balasan. Banyak merek menggunakan ini untuk respons layanan pelanggan otomatis.

Mengembangkan API dengan Apidog

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