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.
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/
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
- Buka Portal Pengembang Facebook
- Login dengan akun Facebook
- Buat Aplikasi Facebook (tipe: Bisnis)
- Tambahkan produk Instagram Graph API
Langkah 2: Tautkan Akun Instagram Bisnis
- Buka Pengaturan Halaman Facebook > Instagram
- Klik Hubungkan Akun
- Login Instagram & otorisasi
- 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()}`;
};
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)}`);
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}`);
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}`);
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}`);
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');
};
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' }
]
});
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}`);
});
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 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}`);
});
});
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}`);
});
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}`);
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');
Menghapus Komentar
const deleteComment = async (commentId) => {
await instagramRequest(`/${commentId}`, {
method: 'DELETE'
});
console.log('Comment deleted');
};
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();
};
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);
}
}
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
- Cache respons β Hindari permintaan data yang sama berulang kali
- Batch request β Gunakan field expansion
- Gunakan webhook β Minimalkan polling
- 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;
}
}
}
};
Pemecahan Masalah Umum
Token OAuth Kedaluwarsa
Gejala: Error βInvalid OAuth access tokenβ.
Solusi:
- Refresh token sebelum 60 hari
- Simpan tanggal kadaluarsa token & beri peringatan sebelum habis
- Paksa re-authenticate jika token kadaluarsa
Publikasi Media Gagal
Gejala: Publikasi gagal/error.
Solusi:
- Pastikan URL gambar dapat diakses publik
- Cek format gambar (JPEG/PNG, <8MB)
- Video: MP4, <1GB, <90 detik
- Tunggu proses video selesai
Wawasan Tidak Tersedia
Gejala: Data insight kosong.
Solusi:
- Pastikan akun Bisnis/Kreator
- Tunggu 24-48 jam setelah posting
- 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)