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.
Apa itu Instagram Graph API?
Instagram Graph API menyediakan akses terprogram ke akun Instagram Bisnis dan Kreator melalui Facebook Graph API. API menangani:
- Publikasi konten (foto, video, reels, korsel)
- Wawasan dan analitik media
- Manajemen komentar dan penyebutan
- Pesan langsung (melalui Instagram Graph API + Messenger Platform)
- Pelacakan hashtag dan penyebutan
- 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 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:
- Kunjungi Portal Pengembang Facebook
- Masuk dengan akun Facebook
- Buat Aplikasi Facebook (tipe: Bisnis)
- Tambahkan produk Instagram Graph API
Langkah 2: Tautkan Akun Instagram Bisnis
Hubungkan Instagram ke Halaman Facebook:
- Buka Pengaturan Halaman Facebook > Instagram
- Klik Hubungkan Akun
- Masuk ke Instagram dan otorisasi
- 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:
- 200 panggilan per jam per aplikasi (dibagikan ke semua pengguna)
- Penemuan Bisnis: 200 panggilan per jam per pengguna
- Publikasi Konten: Dibatasi oleh tipe tindakan
Melebihi batasan akan menghasilkan HTTP 400 dengan subkode kesalahan 613.
Praktik Terbaik Pembatasan Laju
- Cache respons - Jangan mengambil ulang data yang tidak berubah
- Permintaan batch - Gunakan ekspansi bidang untuk mengurangi panggilan
- Gunakan webhook - Pembaruan waktu nyata alih-alih polling
- 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:
- Terapkan penyegaran token sebelum kedaluwarsa 60 hari
- Simpan tanggal kedaluwarsa token dan beri peringatan sebelum kedaluwarsa
- Autentikasi ulang pengguna jika token kedaluwarsa
Masalah: Publikasi Media Gagal
Gejala: Publikasi mengembalikan kesalahan.
Solusi:
- Verifikasi URL gambar dapat diakses secara publik (tidak memerlukan autentikasi)
- Periksa format gambar (JPEG, PNG) dan ukuran (<8MB)
- Pastikan video berformat MP4, <1GB, <90 detik
- Tunggu pemrosesan video sebelum mempublikasikan
Masalah: Wawasan Tidak Tersedia
Gejala: API Wawasan mengembalikan data kosong.
Solusi:
- Verifikasi akun adalah Bisnis atau Kreator (bukan Pribadi)
- Tunggu 24-48 jam hingga wawasan terisi
- Periksa apakah akun memiliki aktivitas yang cukup
Daftar Periksa Penerapan Produksi
Sebelum tayang:
- [ ] Konversi semua akun uji ke Bisnis/Kreator
- [ ] Terapkan OAuth 2.0 dengan token berjangka panjang
- [ ] Simpan token dengan aman menggunakan enkripsi
- [ ] Terapkan penyegaran token otomatis
- [ ] Siapkan endpoint webhook dengan HTTPS
- [ ] Tambahkan pembatasan laju dan antrean permintaan
- [ ] Terapkan penanganan kesalahan yang komprehensif
- [ ] Tambahkan pencatatan untuk semua panggilan API
- [ ] Buat alur kerja moderasi konten
- [ ] Uji dengan beberapa tipe akun
Kasus Penggunaan Dunia Nyata
Alat Penjadwalan Media Sosial
Sebuah platform pemasaran mengotomatiskan postingan:
- Tantangan: Posting manual di lebih dari 50 akun klien
- Solusi: Publikasi terjadwal melalui Instagram API
- Hasil: Penghematan waktu 80%, jadwal posting yang konsisten
Implementasi kunci:
- Kalender konten dengan penjadwalan tarik-dan-lepas
- Publikasi otomatis foto, video, korsel
- Saran hashtag berdasarkan konten
Otomatisasi Layanan Pelanggan
Sebuah merek e-commerce mengotomatiskan respons komentar:
- Tantangan: Respons lambat terhadap pertanyaan pelanggan
- Solusi: Balas otomatis untuk pertanyaan umum melalui webhook
- Hasil: Waktu respons rata-rata 5 menit, kepuasan 90%
Implementasi kunci:
- Deteksi kata kunci (harga, ketersediaan, pengiriman)
- Balas otomatis dengan tautan produk
- Eskalasi pertanyaan kompleks ke agen manusia
Kesimpulan
Instagram Graph API menyediakan akses komprehensif ke fitur akun Instagram Bisnis dan Kreator. Poin-poin penting:
- Autentikasi Facebook Login OAuth 2.0 dengan token 60 hari
- Publikasi konten mendukung foto, video, reels, korsel
- API Wawasan menyediakan data keterlibatan, jangkauan, dan demografi
- Webhook memungkinkan pemantauan komentar dan penyebutan secara waktu nyata
- Batasan laju 200 panggilan/jam per aplikasi memerlukan manajemen yang cermat
- Apidog menyederhanakan pengujian API dan kolaborasi tim
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.
