DEV Community

Cover image for Cara Menggunakan Magento 2 API: Panduan Integrasi E-commerce Lengkap (2026)
Walse
Walse

Posted on • Originally published at apidog.com

Cara Menggunakan Magento 2 API: Panduan Integrasi E-commerce Lengkap (2026)

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.

Coba Apidog hari ini


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

  1. Login ke Admin Panel Magento
  2. Navigasi: Sistem > Izin > Semua Pengguna
  3. Buat user admin (untuk token admin), ATAU
  4. Navigasi: Sistem > Ekstensi > Integrasi
  5. 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
Enter fullscreen mode Exit fullscreen mode

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"
Enter fullscreen mode Exit fullscreen mode

Langkah 4: Buat Integrasi (Direkomendasikan untuk Pihak Ketiga)

  1. Admin Panel: Sistem > Ekstensi > Integrasi
  2. Klik Tambah Integrasi Baru
  3. Isi detail: Nama, email, callback URL (untuk OAuth)
  4. Atur Izin API (produk, pesanan, pelanggan, inventaris)
  5. Klik Simpan lalu Aktifkan
  6. 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');
Enter fullscreen mode Exit fullscreen mode

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

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

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

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

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

Menghapus Produk

const deleteProduct = async (sku) => {
  await magentoRequest(`/V1/products/${sku}`, {
    method: 'DELETE'
  });

  console.log(`Produk ${sku} dihapus`);
};
Enter fullscreen mode Exit fullscreen mode

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

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

Alur Status Pesanan

pending → processing → complete
        → canceled
        → on_hold
        → payment_review
Enter fullscreen mode Exit fullscreen mode

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

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

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

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

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

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

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

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
Enter fullscreen mode Exit fullscreen mode

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

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)