DEV Community

Cover image for Cara Menggunakan Instagram Graph API di Tahun 2026
Walse
Walse

Posted on • Originally published at apidog.com

Cara Menggunakan Instagram Graph API di Tahun 2026

TL;DR

Instagram Graph API memungkinkan pengembang mengelola akun Instagram Bisnis dan Kreator secara terprogram dengan autentikasi Facebook Login OAuth 2.0, endpoint berbasis GraphQL untuk publikasi konten, wawasan, komentar, dan pesan. Batas laju adalah 200 panggilan per jam per aplikasi. Artikel ini memandu Anda dari setup autentikasi hingga strategi integrasi produksi.

Coba Apidog hari ini

Pendahuluan

Instagram memiliki lebih dari 2 miliar pengguna aktif bulanan dan 200+ juta akun bisnis. Untuk membangun tool manajemen media sosial, platform analitik, atau integrasi e-commerce, mengotomatisasi Instagram Graph API adalah kunci menjangkau audiens besar.

Manajer media sosial yang menangani banyak akun bisa kehilangan 20-30 jam/minggu untuk posting manual, moderasi komentar, dan kompilasi analitik. Integrasi API yang baik mengotomatiskan publikasi, moderasi, analisis sentimen, dan pelaporan.

Panduan ini membahas langkah implementasi: autentikasi Facebook Login, publikasi konten, pengambilan wawasan, manajemen komentar, webhook, dan best practice untuk produksi. Anda akan siap menjalankan integrasi Instagram siap produksi.

πŸ’‘ Apidog menyederhanakan pengujian integrasi API: uji endpoint Instagram, validasi OAuth, cek respons API, debug masalah publikasi, dan bagikan skenario pengujian dengan tim. Pelajari di sini.

Apa itu Instagram Graph API?

Instagram Graph API adalah API berbasis Facebook Graph API yang memungkinkan akses terprogram ke akun Bisnis/Kreator untuk:

  • Publikasi konten (foto, video, reels, korsel)
  • Wawasan & analitik media
  • Manajemen komentar & mention
  • Pesan langsung (dengan Messenger Platform)
  • Pelacakan hashtag/mention
  • Manajemen Cerita
  • Belanja dan tag produk

Fitur Utama

Fitur Deskripsi
API Berbasis Graf Akses sumber daya berbasis node
OAuth 2.0 Autentikasi Facebook Login
Webhook Notifikasi real-time untuk komentar, mention
Pembatasan Laju 200 panggilan/jam/aplikasi
Publikasi Konten Foto, video, reels, korsel
Wawasan Metrik engagement, reach, impressions
Moderasi Manajemen komentar, mention, pesan

Persyaratan Akun

Tipe Akun Akses API
Bisnis Akses API penuh
Kreator Akses API penuh
Pribadi Tidak ada akses API
Privat Wawasan terbatas

Ikhtisar Arsitektur API

Semua endpoint menggunakan base URL:

https://graph.facebook.com/v18.0/
Enter fullscreen mode Exit fullscreen mode

Perbandingan Versi API

Versi Status Tanggal Berakhir Kasus Penggunaan
v18.0 Aktif Maret 2026 Integrasi baru
v17.0 Usang Jan 2026 Integrasi lama
v16.0 Tidak Aktif Kedaluwarsa Jangan gunakan

Selalu target versi stabil terbaru.

Memulai: Pengaturan Autentikasi

Langkah 1: Buat Akun Pengembang Facebook

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

Langkah 2: Tautkan Akun Instagram Bisnis

  1. Buka Pengaturan Halaman Facebook > Instagram
  2. Klik Hubungkan Akun
  3. Login Instagram & otorisasi
  4. Pastikan akun Bisnis sudah tertaut

Akun pribadi harus dikonversi ke Bisnis/Kreator di Pengaturan Instagram.

Langkah 3: Dapatkan Token Akses

Generate URL otorisasi OAuth:

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;

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()}`;
};
Enter fullscreen mode Exit fullscreen mode

Izin yang Diperlukan

Izin Deskripsi
instagram_basic Profil dasar, daftar media
instagram_content_publish Publikasi foto, video, korsel
instagram_manage_comments Baca/tulis komentar
instagram_manage_insights Akses data analitik
pages_read_engagement Akses halaman
pages_manage_posts Publikasikan ke Halaman

Langkah 4: Tukarkan Token untuk Token Berjangka Panjang

Token akses pendek berlaku 1 jam. Tukarkan ke token 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)}`);
Enter fullscreen mode Exit fullscreen mode

Langkah 5: Dapatkan ID Akun Instagram Bisnis

Ambil ID akun Instagram Bisnis yang tertaut ke Halaman Facebook:

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}`);
Enter fullscreen mode Exit fullscreen mode

Langkah 6: Lakukan Panggilan API Terautentikasi

Buat klien API reusable:

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}`);
Enter fullscreen mode Exit fullscreen mode

Publikasi Konten

Mempublikasikan Foto

const publishPhoto = async (igAccountId, photoData) => {
  // Step 1: Buat 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: Publikasikan 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}`);
Enter fullscreen mode Exit fullscreen mode

Mempublikasikan Video

const publishVideo = async (igAccountId, videoData) => {
  // Step 1: Buat 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', // atau 'VIDEO'
    share_to_feed: 'true' // Untuk Reels
  });
  const creationId = containerResponse.id;

  // Tunggu proses video selesai
  await waitForVideoProcessing(creationId);

  // Step 2: Publikasikan 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');
};
Enter fullscreen mode Exit fullscreen mode

Mempublikasikan Korsel (Beberapa Gambar/Video)

const publishCarousel = async (igAccountId, carouselData) => {
  const children = [];
  // Step 1: Buat setiap item carousel
  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: Buat container carousel
  const carouselContainerResponse = await instagramRequest(`/${igAccountId}/media`, {
    method: 'POST',
    media_type: 'CAROUSEL',
    children: children.join(','),
    caption: carouselData.caption
  });
  const creationId = carouselContainerResponse.id;

  // Step 3: Publikasikan 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' }
  ]
});
Enter fullscreen mode Exit fullscreen mode

Tipe Media

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

Mengambil Media dan Wawasan

Mendapatkan Media Pengguna

Ambil media yang sudah 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}`);
});
Enter fullscreen mode Exit fullscreen mode

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}`);
});
Enter fullscreen mode Exit fullscreen mode

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 agregat akun:

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
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}`);
  });
});
Enter fullscreen mode Exit fullscreen mode

Metrik Tingkat Akun

Metrik Deskripsi
impressions Total tayangan profil + konten
reach Akun unik yang dijangkau
profile_views Kunjungan profil
website_clicks Klik link 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}`);
});
Enter fullscreen mode Exit fullscreen mode

Membalas Komentar

Balas komentar secara otomatis:

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}`);
Enter fullscreen mode Exit fullscreen mode

Menyembunyikan Komentar

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

// Usage
await hideComment('17900000000000000');
console.log('Comment hidden');
Enter fullscreen mode Exit fullscreen mode

Menghapus Komentar

const deleteComment = async (commentId) => {
  await instagramRequest(`/${commentId}`, {
    method: 'DELETE'
  });
  console.log('Comment deleted');
};
Enter fullscreen mode Exit fullscreen mode

Webhook

Mengkonfigurasi Webhook

Daftarkan webhook untuk event real-time:

const subscribeToWebhooks = async (appId, pageId, accessToken) => {
  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();
};
Enter fullscreen mode Exit fullscreen mode

Menangani Webhook

Contoh implementasi dengan Express.js:

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

// Verifikasi subscription webhook
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');
  }
});

// Tangani event webhook
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}`);
  // Otomatis moderasi jika spam
  if (isSpam(data.text)) {
    await hideComment(data.id);
  }
}
Enter fullscreen mode Exit fullscreen mode

Bidang Webhook

Field Pemicu
comments Komentar/balasan baru
mentions Mention ke akun
message_reactions Reaksi ke cerita
story_status Balasan/tayangan cerita

Pembatasan Laju

Memahami Pembatasan Laju

  • 200 panggilan/jam/aplikasi (global)
  • Penemuan Bisnis: 200 panggilan/jam/pengguna
  • Publikasi Konten: dibatasi per tipe

Jika melebihi batas, API mengembalikan HTTP 400 (subkode 613).

Praktik Terbaik Pembatasan Laju

  1. Cache respons – Hindari permintaan data yang sama berulang kali
  2. Batch request – Gunakan field expansion
  3. Gunakan webhook – Minimalkan polling
  4. Backoff – Terapkan backoff eksponensial pada error 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;
      }
    }
  }
};
Enter fullscreen mode Exit fullscreen mode

Pemecahan Masalah Umum

Token OAuth Kedaluwarsa

Gejala: Error β€œInvalid OAuth access token”.

Solusi:

  1. Refresh token sebelum 60 hari
  2. Simpan tanggal kadaluarsa token & beri peringatan sebelum habis
  3. Paksa re-authenticate jika token kadaluarsa

Publikasi Media Gagal

Gejala: Publikasi gagal/error.

Solusi:

  1. Pastikan URL gambar dapat diakses publik
  2. Cek format gambar (JPEG/PNG, <8MB)
  3. Video: MP4, <1GB, <90 detik
  4. Tunggu proses video selesai

Wawasan Tidak Tersedia

Gejala: Data insight kosong.

Solusi:

  1. Pastikan akun Bisnis/Kreator
  2. Tunggu 24-48 jam setelah posting
  3. Akun harus ada aktivitas

Daftar Periksa Penerapan Produksi

Sebelum go-live:

  • [ ] Pastikan semua akun uji = Bisnis/Kreator
  • [ ] Pakai OAuth 2.0 + token 60 hari
  • [ ] Simpan token dengan enkripsi
  • [ ] Refresh token otomatis
  • [ ] Endpoint webhook pakai HTTPS
  • [ ] Implementasi pembatasan laju & queue
  • [ ] Penanganan error komprehensif
  • [ ] Logging semua panggilan API
  • [ ] Alur kerja moderasi konten
  • [ ] Uji di berbagai tipe akun

Kasus Penggunaan Dunia Nyata

Alat Penjadwalan Media Sosial

Platform marketing mengotomatiskan posting:

  • Tantangan: Posting manual >50 akun klien
  • Solusi: Publikasi terjadwal via API
  • Hasil: Hemat waktu 80%, posting konsisten

Implementasi:

  • Kalender konten drag-and-drop
  • Publikasi otomatis (foto, video, korsel)
  • Saran hashtag otomatis

Otomatisasi Layanan Pelanggan

Merek e-commerce mengotomatiskan balasan komentar:

  • Tantangan: Respons lambat pertanyaan pelanggan
  • Solusi: Balasan otomatis via webhook
  • Hasil: Waktu respons 5 menit, kepuasan 90%

Implementasi:

  • Deteksi kata kunci (harga, stok, kirim)
  • Balasan otomatis dengan link produk
  • Eskalasi ke agen manusia untuk kasus kompleks

Kesimpulan

Instagram Graph API menyediakan akses komprehensif ke fitur akun Bisnis/Kreator. Poin penting:

  • Autentikasi OAuth 2.0 dengan token 60 hari
  • Publikasi konten: foto, video, reels, korsel
  • API Insight untuk engagement, reach, demografi
  • Webhook untuk monitoring komentar/mention real-time
  • Batasan laju: 200 panggilan/jam/aplikasi β†’ perlu manajemen
  • Apidog menyederhanakan pengujian API & kolaborasi tim

Bagian FAQ

Bagaimana cara mendapatkan akses ke Instagram API?

Buat akun Pengembang Facebook, aplikasi Bisnis, tambahkan produk Instagram Graph API, otorisasi via 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/Kreator.

Jenis akun Instagram apa yang mendukung API?

Hanya akun Bisnis dan Kreator yang punya akses penuh. Akun pribadi akses terbatas atau tidak ada.

Bagaimana cara mendapatkan komentar dari Instagram?

Gunakan endpoint Komentar (/{media-id}/comments) untuk ambil komentar pada media. Webhook untuk notif real-time.

Apa saja batasan laju Instagram?

Batas: 200 panggilan/jam/aplikasi. Beberapa endpoint juga dibatasi per pengguna.

Bisakah saya mempublikasikan Cerita melalui API?

Ya, Cerita dapat dipublikasikan menggunakan flow publikasi konten yang sama.

Bagaimana cara mengakses Instagram Insights?

Minta izin instagram_manage_insights saat OAuth. Gunakan endpoint Wawasan untuk metrik media & akun.

Bisakah saya membalas komentar secara otomatis?

Ya, gunakan API Komentar untuk membalas otomatis. Banyak brand memakai ini untuk automation customer service.

Top comments (0)