TL;DR
API Magento 2 (Adobe Commerce) memungkinkan integrasi programatik dengan toko e-commerce menggunakan endpoint REST, SOAP, dan GraphQL. Otentikasi menggunakan OAuth 1.0a atau token, dengan akses ke produk, pesanan, pelanggan, inventaris, dan lainnya. Tersedia rate limits yang dapat dikonfigurasi. Panduan ini membahas pengaturan otentikasi, operasi CRUD, webhook, endpoint kustom, dan strategi penerapan produksi.
Pendahuluan
Adobe Commerce (Magento) digunakan oleh lebih dari 250.000 toko e-commerce dengan volume transaksi tahunan lebih dari $155 miliar. Untuk pengembang solusi integrasi e-commerce, konektor ERP, atau aplikasi mobile, integrasi API Magento adalah kebutuhan penting agar bisa menjangkau merchant dalam skala besar.
Fakta di lapangan: merchant multi-channel bisa kehilangan 20–30 jam per minggu hanya untuk entri data manual antara Magento dan sistem lain. Integrasi API Magento yang tepat akan mengotomatiskan sinkronisasi produk, pemrosesan pesanan, update inventaris, dan manajemen data pelanggan.
Panduan ini membahas end-to-end integrasi API Magento 2: otentikasi OAuth 1.0a/token, endpoint REST/SOAP/GraphQL, manajemen produk & pesanan, webhook, pengembangan endpoint kustom, hingga deployment production-ready.
💡 Apidog menyederhanakan pengujian integrasi API. Uji endpoint Magento Anda, validasi alur otentikasi, cek respons API, serta debug masalah integrasi di satu workspace. Impor spesifikasi API, mock respons, dan bagikan skenario testing ke tim.
Apa Itu API Magento 2?
Magento 2 menyediakan tiga tipe API utama:
- REST API: JSON, cocok untuk aplikasi web & mobile.
- SOAP API: XML, integrasi enterprise.
- GraphQL: Query-based, frontend efisien.
API Magento 2 menyediakan akses ke:
- Produk, kategori, inventaris
- Pesanan, faktur, pengiriman
- Pelanggan, grup pelanggan
- Keranjang belanja, checkout
- Promosi, aturan harga
- CMS (halaman & blok)
- Konfigurasi toko
Fitur Utama
| Fitur | Deskripsi |
|---|---|
| Berbagai Protokol | REST, SOAP, GraphQL |
| OAuth 1.0a | Akses pihak ketiga yang aman |
| Otentikasi Token | Token admin & integrasi |
| Webhook | Operasi asinkron via antrean |
| Pembatasan Tingkat | Konfigurable per instalasi |
| Endpoint Kustom | Dapat diperluas via API custom |
| Multi-Toko | Satu API, multi-store view |
Perbandingan API
| Jenis API | Protokol | Use Case |
|---|---|---|
| REST | JSON | Aplikasi mobile, integrasi |
| SOAP | XML | Sistem enterprise (SAP, Oracle) |
| GraphQL | GraphQL | Storefront, PWA |
Versi Magento
| Versi | Status | Akhir Dukungan |
|---|---|---|
| Magento 2.4.x | Aktif | Aktif |
| Adobe Commerce 2.4.x | Aktif | Aktif |
| Magento 1.x | EOL | Juni 2020 (jangan dipakai) |
Memulai: Pengaturan Otentikasi
Langkah 1: Buat Akun Admin atau Integrasi
- Login ke Admin Panel Magento
- Navigasi: Sistem > Izin > Semua Pengguna
- Buat user admin (untuk token admin), ATAU
- Navigasi: Sistem > Ekstensi > Integrasi
- Buat integrasi baru (untuk OAuth/token integrasi)
Langkah 2: Pilih Metode Otentikasi
| Metode | Use Case | Masa Pakai Token |
|---|---|---|
| Token Admin | Integrasi internal | Konfigurable (default 4 jam) |
| Token Integrasi | App pihak ketiga | Sampai dicabut |
| OAuth 1.0a | App publik/pasar | Sampai dicabut |
| Token Pelanggan | App customer-facing | Konfigurable |
Langkah 3: Dapatkan Token Admin (Cara Termudah)
Generate token admin untuk integrasi internal:
const MAGENTO_BASE_URL = process.env.MAGENTO_BASE_URL;
const MAGENTO_ADMIN_USERNAME = process.env.MAGENTO_ADMIN_USERNAME;
const MAGENTO_ADMIN_PASSWORD = process.env.MAGENTO_ADMIN_PASSWORD;
const getAdminToken = async () => {
const response = await fetch(`${MAGENTO_BASE_URL}/rest/V1/integration/admin/token`, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
username: MAGENTO_ADMIN_USERNAME,
password: MAGENTO_ADMIN_PASSWORD
})
});
if (!response.ok) {
throw new Error('Kredensial admin tidak valid');
}
const token = await response.text();
return token;
};
// Penggunaan
const token = await getAdminToken();
console.log(`Token admin: ${token}`);
// Simpan token ini dengan aman
Tips keamanan: simpan token di .env:
# file .env
MAGENTO_BASE_URL="https://store.example.com"
MAGENTO_ADMIN_USERNAME="api_user"
MAGENTO_ADMIN_PASSWORD="secure_password_here"
MAGENTO_ACCESS_TOKEN="obtained_via_auth"
Langkah 4: Buat Integrasi (Direkomendasikan untuk Pihak Ketiga)
- Admin Panel: Sistem > Ekstensi > Integrasi
- Klik Tambah Integrasi Baru
- Isi detail: Nama, email, callback URL (untuk OAuth)
- Atur Izin API (produk, pesanan, pelanggan, inventaris)
- Klik Simpan lalu Aktifkan
- Salin Token Akses dan Rahasia Token
Langkah 5: Dapatkan Token Pelanggan
Untuk aplikasi customer-facing:
const getCustomerToken = async (email, password) => {
const response = await fetch(`${MAGENTO_BASE_URL}/rest/V1/integration/customer/token`, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
username: email,
password: password
})
});
if (!response.ok) {
throw new Error('Kredensial pelanggan tidak valid');
}
const token = await response.text();
return token;
};
// Penggunaan
const customerToken = await getCustomerToken('customer@example.com', 'password123');
Langkah 6: Lakukan Panggilan API yang Diautentikasi
Reusable API client:
const magentoRequest = async (endpoint, options = {}) => {
const token = await getAdminToken(); // Atau gunakan token yang sudah disimpan
const response = await fetch(`${MAGENTO_BASE_URL}/rest${endpoint}`, {
...options,
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json',
...options.headers
}
});
if (!response.ok) {
const error = await response.json();
throw new Error(`Kesalahan API Magento: ${error.message}`);
}
return response.json();
};
// Penggunaan
const products = await magentoRequest('/V1/products');
console.log(`Ditemukan ${products.items.length} produk`);
Manajemen Produk
Mendapatkan Produk
Ambil produk dengan filter:
const getProducts = async (filters = {}) => {
const params = new URLSearchParams();
if (filters.search) {
params.append('searchCriteria[filterGroups][0][filters][0][field]', 'sku');
params.append('searchCriteria[filterGroups][0][filters][0][value]', `%${filters.search}%`);
params.append('searchCriteria[filterGroups][0][filters][0][conditionType]', 'like');
}
if (filters.priceFrom) {
params.append('searchCriteria[filterGroups][1][filters][0][field]', 'price');
params.append('searchCriteria[filterGroups][1][filters][0][value]', filters.priceFrom);
params.append('searchCriteria[filterGroups][1][filters][0][conditionType]', 'gteq');
}
params.append('searchCriteria[pageSize]', filters.limit || 20);
params.append('searchCriteria[currentPage]', filters.page || 1);
const response = await magentoRequest(`/V1/products?${params.toString()}`);
return response;
};
// Penggunaan
const products = await getProducts({ search: 'baju', priceFrom: 20, limit: 50 });
products.items.forEach(product => {
console.log(`${product.sku}: ${product.name} - $${product.price}`);
});
Mendapatkan Satu Produk
Ambil produk berdasarkan SKU:
const getProduct = async (sku) => {
const response = await magentoRequest(`/V1/products/${sku}`);
return response;
};
// Penggunaan
const product = await getProduct('TSHIRT-001');
console.log(`Nama: ${product.name}`);
console.log(`Harga: $${product.price}`);
console.log(`Stok: ${product.extension_attributes?.stock_item?.qty}`);
Membuat Produk
Buat produk sederhana:
const createProduct = async (productData) => {
const product = {
product: {
sku: productData.sku,
name: productData.name,
attribute_set_id: productData.attributeSetId || 4,
type_id: 'simple',
price: productData.price,
status: productData.status || 1,
visibility: productData.visibility || 4,
weight: productData.weight || 1,
extension_attributes: {
stock_item: {
qty: productData.qty || 0,
is_in_stock: productData.qty > 0 ? true : false
}
},
custom_attributes: [
{ attribute_code: 'description', value: productData.description },
{ attribute_code: 'short_description', value: productData.shortDescription },
{ attribute_code: 'color', value: productData.color },
{ attribute_code: 'size', value: productData.size }
]
}
};
const response = await magentoRequest('/V1/products', {
method: 'POST',
body: JSON.stringify(product)
});
return response;
};
// Penggunaan
const newProduct = await createProduct({
sku: 'TSHIRT-BARU-001',
name: 'Kaos Katun Premium',
price: 29.99,
qty: 100,
description: 'Kaos katun berkualitas tinggi',
shortDescription: 'Kaos katun premium',
color: 'Biru',
size: 'M'
});
console.log(`Produk dibuat: ${newProduct.id}`);
Memperbarui Produk
const updateProduct = async (sku, updates) => {
const product = {
product: {
sku: sku,
...updates
}
};
const response = await magentoRequest(`/V1/products/${sku}`, {
method: 'PUT',
body: JSON.stringify(product)
});
return response;
};
// Penggunaan
await updateProduct('TSHIRT-001', {
price: 24.99,
extension_attributes: {
stock_item: {
qty: 150,
is_in_stock: true
}
}
});
Menghapus Produk
const deleteProduct = async (sku) => {
await magentoRequest(`/V1/products/${sku}`, {
method: 'DELETE'
});
console.log(`Produk ${sku} dihapus`);
};
Jenis Produk
| Tipe | Deskripsi | Use Case |
|---|---|---|
| Sederhana | Satu SKU | Produk standar |
| Dapat Dikonfigurasi | Induk + variasi | Pilihan ukuran/warna |
| Dikelompokkan | Kumpulan produk | Paket produk |
| Virtual | Non-fisik | Layanan, unduhan |
| Paket (Bundle) | Paket customizable | Kit rakit sendiri |
| Dapat Diunduh | Produk digital | E-book, software |
Manajemen Pesanan
Mendapatkan Pesanan
const getOrders = async (filters = {}) => {
const params = new URLSearchParams();
if (filters.status) {
params.append('searchCriteria[filterGroups][0][filters][0][field]', 'status');
params.append('searchCriteria[filterGroups][0][filters][0][value]', filters.status);
params.append('searchCriteria[filterGroups][0][filters][0][conditionType]', 'eq');
}
if (filters.dateFrom) {
params.append('searchCriteria[filterGroups][1][filters][0][field]', 'created_at');
params.append('searchCriteria[filterGroups][1][filters][0][value]', filters.dateFrom);
params.append('searchCriteria[filterGroups][1][filters][0][conditionType]', 'gteq');
}
params.append('searchCriteria[pageSize]', filters.limit || 20);
params.append('searchCriteria[currentPage]', filters.page || 1);
const response = await magentoRequest(`/V1/orders?${params.toString()}`);
return response;
};
// Penggunaan
const orders = await getOrders({
status: 'pending',
dateFrom: '2026-03-18 00:00:00',
limit: 50
});
orders.items.forEach(order => {
console.log(`Pesanan #${order.increment_id}: ${order.customer_email} - $${order.grand_total}`);
});
Mendapatkan Satu Pesanan
const getOrder = async (orderId) => {
const response = await magentoRequest(`/V1/orders/${orderId}`);
return response;
};
// Penggunaan
const order = await getOrder(12345);
console.log(`Pesanan #${order.increment_id}`);
console.log(`Status: ${order.status}`);
console.log(`Total: $${order.grand_total}`);
console.log(`Item:`);
order.items.forEach(item => {
console.log(` - ${item.name} x ${item.qty_ordered}`);
});
Alur Status Pesanan
pending → processing → complete
→ canceled
→ on_hold
→ payment_review
Memperbarui Status Pesanan
const updateOrderStatus = async (orderId, newStatus) => {
// Pembaruan status langsung butuh endpoint kustom
// Gunakan alur berikut:
// Cancel:
await magentoRequest(`/V1/orders/${orderId}/cancel`, { method: 'POST' });
// Hold:
await magentoRequest(`/V1/orders/${orderId}/hold`, { method: 'POST' });
// Unhold:
await magentoRequest(`/V1/orders/${orderId}/unhold`, { method: 'POST' });
};
Membuat Faktur
const createInvoice = async (orderId, items = [], notify = true, appendComment = false, comment = null) => {
const invoice = {
capture: true,
last: true,
items: items
};
if (comment) {
invoice.comment = comment;
invoice.notify_customer = notify ? 1 : 0;
invoice.append_comment = appendComment ? 1 : 0;
}
const response = await magentoRequest(`/V1/order/${orderId}/invoice`, {
method: 'POST',
body: JSON.stringify(invoice)
});
return response;
};
// Penggunaan
const invoiceId = await createInvoice(12345, [], true, false, 'Terima kasih atas pesanan Anda!');
console.log(`Faktur dibuat: ${invoiceId}`);
Membuat Pengiriman
const createShipment = async (orderId, items = [], notify = true, appendComment = false, comment = null, tracks = []) => {
const shipment = {
items: items,
notify: notify ? 1 : 0,
append_comment: appendComment ? 1 : 0,
comment: comment,
tracks: tracks
};
const response = await magentoRequest(`/V1/order/${orderId}/ship`, {
method: 'POST',
body: JSON.stringify(shipment)
});
return response;
};
// Penggunaan
const shipmentId = await createShipment(12345, [], true, false, 'Pesanan Anda telah dikirim!', [
{
track_number: '1Z999AA10123456784',
title: 'Nomor Pelacakan',
carrier_code: 'ups'
}
]);
console.log(`Pengiriman dibuat: ${shipmentId}`);
Manajemen Pelanggan
Mendapatkan Pelanggan
const getCustomers = async (filters = {}) => {
const params = new URLSearchParams();
if (filters.email) {
params.append('searchCriteria[filterGroups][0][filters][0][field]', 'email');
params.append('searchCriteria[filterGroups][0][filters][0][value]', filters.email);
params.append('searchCriteria[filterGroups][0][filters][0][conditionType]', 'eq');
}
params.append('searchCriteria[pageSize]', filters.limit || 20);
const response = await magentoRequest(`/V1/customers/search?${params.toString()}`);
return response;
};
// Penggunaan
const customers = await getCustomers({ email: 'customer@example.com' });
customers.items.forEach(customer => {
console.log(`${customer.firstname} ${customer.lastname} - ${customer.email}`);
});
Membuat Pelanggan
const createCustomer = async (customerData) => {
const customer = {
customer: {
websiteId: customerData.websiteId || 1,
email: customerData.email,
firstname: customerData.firstname,
lastname: customerData.lastname,
middlename: customerData.middlename || '',
gender: customerData.gender || 0,
store_id: customerData.storeId || 0,
extension_attributes: {
is_subscribed: customerData.subscribed || false
}
},
password: customerData.password
};
const response = await magentoRequest('/V1/customers', {
method: 'POST',
body: JSON.stringify(customer)
});
return response;
};
// Penggunaan
const newCustomer = await createCustomer({
email: 'newcustomer@example.com',
firstname: 'John',
lastname: 'Doe',
password: 'SecurePass123!',
subscribed: true
});
console.log(`Pelanggan dibuat: ID ${newCustomer.id}`);
Manajemen Inventaris (MSI)
Mendapatkan Status Stok
const getStockStatus = async (sku) => {
const response = await magentoRequest(`/V1/products/${sku}/stockItems/1`);
return response;
};
// Penggunaan
const stock = await getStockStatus('TSHIRT-001');
console.log(`Jumlah: ${stock.qty}`);
console.log(`Dalam Stok: ${stock.is_in_stock}`);
console.log(`Jumlah Min: ${stock.min_qty}`);
Memperbarui Stok
const updateStock = async (sku, qty, isInStock = null) => {
const stockItem = {
stockItem: {
qty: qty,
is_in_stock: isInStock !== null ? isInStock : qty > 0
}
};
const response = await magentoRequest(`/V1/products/${sku}/stockItems/1`, {
method: 'PUT',
body: JSON.stringify(stockItem)
});
return response;
};
// Penggunaan
await updateStock('TSHIRT-001', 100, true);
Webhook dan Operasi Asinkron
Menyiapkan Webhook
Magento tidak memiliki webhook out-of-the-box. Alternatif:
// 1. Polling endpoint pesanan secara periodik
const pollNewOrders = async (lastOrderId) => {
const orders = await getOrders({
dateFrom: new Date().toISOString()
});
const newOrders = orders.items.filter(o => o.id > lastOrderId);
return newOrders;
};
// 2. Adobe I/O Events (khusus Adobe Commerce)
// Konfigurasi event di Adobe Developer Console
// 3. Modul webhook kustom
// Lihat: https://devdocs.magento.com/guides/v2.4/extension-dev-guide/message-queues/message-queues.html
Pembatasan Tingkat (Rate Limiting)
Memahami Pembatasan Tingkat
- Default: Tidak ada rate limit, dapat dikonfigurasi di Admin.
- Rekomendasi: 100–1000 request/menit.
- Konfigurasi: Toko > Konfigurasi > Layanan > API Web > Keamanan
Penanganan Rate Limit Otomatis
const makeRateLimitedRequest = async (endpoint, options = {}, maxRetries = 3) => {
for (let attempt = 1; attempt <= maxRetries; attempt++) {
try {
const response = await magentoRequest(endpoint, options);
return response;
} catch (error) {
if (error.message.includes('429') && attempt < maxRetries) {
const delay = Math.pow(2, attempt) * 1000;
await new Promise(resolve => setTimeout(resolve, delay));
} else {
throw error;
}
}
}
};
Daftar Periksa Penerapan Produksi
Sebelum live:
- [ ] Gunakan token integrasi (bukan admin) di production
- [ ] Simpan token secara aman (DB terenkripsi/env)
- [ ] Terapkan pembatasan tingkat + antrean request
- [ ] Error handling komprehensif
- [ ] Logging semua panggilan API
- [ ] Alternatif webhook (polling/Adobe I/O)
- [ ] Uji dengan data produksi
- [ ] Retry logic untuk request gagal
Kasus Penggunaan Dunia Nyata
Integrasi ERP
- Tantangan: Update stok manual ERP ↔ Magento
- Solusi: Sinkronisasi API dua arah tiap 15 menit
- Hasil: Inventaris real-time, overselling nol
Aplikasi Mobile
- Tantangan: Perlu pengalaman mobile native
- Solusi: GraphQL API untuk browsing produk, REST untuk checkout
- Hasil: Konversi mobile naik 40%
Kesimpulan
API Magento 2 menawarkan fungsionalitas e-commerce luas:
- API REST, SOAP, dan GraphQL tersedia
- Otentikasi berbasis token
- Operasi CRUD produk, pesanan, pelanggan
- MSI untuk manajemen stok multi-source
- Rate limit konfigurable per instalasi
- Apidog mempermudah pengujian API & kolaborasi tim
Bagian FAQ
Bagaimana cara melakukan otentikasi dengan API Magento?
Gunakan token admin untuk integrasi internal, atau buat Integrasi di Sistem > Ekstensi untuk OAuth. Token pelanggan untuk aplikasi customer-facing.
Apa perbedaan antara REST dan GraphQL di Magento?
REST menyediakan full CRUD. GraphQL dioptimalkan untuk query frontend dengan pengambilan data efisien.
Bagaimana cara membuat produk melalui API?
POST ke /V1/products dengan data produk (SKU, nama, harga, stock_item di extension_attributes).
Bisakah saya mendapatkan webhook untuk pesanan baru?
Magento tidak punya webhook bawaan. Gunakan polling, Adobe I/O Events (Adobe Commerce), atau modul kustom.
Bagaimana cara memperbarui kuantitas stok?
PUT ke /V1/products/{sku}/stockItems/1 dengan qty dan is_in_stock.
Top comments (0)