TL;DR
Die Magento 2 (Adobe Commerce) API ermöglicht Entwicklern die programmatische Integration mit E-Commerce-Shops. Sie verwendet REST-, SOAP- und GraphQL-Endpunkte mit OAuth 1.0a und tokenbasierter Authentifizierung und bietet Zugriff auf Produkte, Bestellungen, Kunden, Inventar und mehr, mit konfigurierbaren Ratenlimits. Dieser Leitfaden behandelt die Authentifizierungseinrichtung, CRUD-Operationen, Webhooks, benutzerdefinierte Endpunkte und Integrationsstrategien für die Produktion.
Einführung
Adobe Commerce (Magento) betreibt über 250.000 E-Commerce-Shops mit einem jährlichen Bruttowarenwert von über 155 Milliarden US-Dollar. Für Entwickler, die E-Commerce-Integrationen, ERP-Konnektoren oder mobile Apps erstellen, ist die Magento API-Integration unerlässlich, um diesen riesigen Händlerstamm zu erreichen.
Händler, die mehrere Vertriebskanäle verwalten, verlieren wöchentlich 20-30 Stunden durch manuelle Dateneingaben zwischen Magento und anderen Systemen. Eine solide Magento API-Integration automatisiert die Produktsynchronisation, Auftragsabwicklung, Bestandsaktualisierungen und das Kundenbeziehungsmanagement.
In diesem Leitfaden lernst du, wie du eine vollständige Magento 2 API-Integration umsetzt: Authentifizierung (OAuth 1.0a, Token), Nutzung der REST/SOAP/GraphQL-Endpunkte, Verwaltung von Produkten und Bestellungen, Webhooks, Entwicklung eigener APIs und produktionsreife Deployment-Strategien.
💡 Tipp: Apidog vereinfacht das Testen der API-Integration. Teste deine Magento-Endpunkte, validiere Authentifizierungsabläufe, prüfe API-Antworten und debugge Integrationsprobleme in einem Arbeitsbereich. Importiere API-Spezifikationen, modelliere Antworten und teile Testszenarien mit deinem Team.
Was ist die Magento 2 API?
Magento 2 bietet drei API-Typen für den Zugriff auf E-Commerce-Daten:
- REST API: JSON-basiert für Web- und mobile Anwendungen
- SOAP API: XML-basiert für Unternehmensintegrationen
- GraphQL: Abfrage-basiert für effiziente Frontend-Anwendungen
Du kannst mit der API folgende Ressourcen verwalten:
- Produkte, Kategorien und Inventar
- Bestellungen, Rechnungen und Lieferungen
- Kunden und Kundengruppen
- Warenkorb und Kasse
- Werbeaktionen und Preisregeln
- CMS-Seiten und -Blöcke
- Shop-Konfiguration
Hauptfunktionen
| Funktion | Beschreibung |
|---|---|
| Mehrere Protokolle | REST, SOAP, GraphQL |
| OAuth 1.0a | Sicherer Zugriff von Drittanbietern |
| Token-Authentifizierung | Admin- und Integrationstoken |
| Webhooks | Asynchrone Operationen über Warteschlangen |
| Ratenbegrenzung | Pro Installation konfigurierbar |
| Benutzerdefinierte Endpunkte | Eigene APIs erweiterbar |
| Multi-Store | Eine API, mehrere Store-Ansichten |
API-Vergleich
| API-Typ | Protokoll | Anwendungsfall |
|---|---|---|
| REST | JSON | Mobile Apps, Integrationen |
| SOAP | XML | Unternehmenssysteme (SAP, Oracle) |
| GraphQL | GraphQL | Storefront, PWA |
Magento-Versionen
| Version | Status | Ende des Supports |
|---|---|---|
| Magento 2.4.x | Aktuell | Aktiv |
| Adobe Commerce 2.4.x | Aktuell | Aktiv |
| Magento 1.x | EOL | Juni 2020 (Nicht verwenden) |
Erste Schritte: Authentifizierung einrichten
Schritt 1: Admin-Konto oder Integration erstellen
- Im Magento Admin Panel anmelden
- Navigiere zu System > Berechtigungen > Alle Benutzer und erstelle einen Admin-Benutzer (für Admin-Token)
- Alternativ: System > Erweiterungen > Integrationen und neue Integration erstellen (für OAuth)
Schritt 2: Authentifizierungsmethode wählen
| Methode | Am besten geeignet für | Token-Lebensdauer |
|---|---|---|
| Admin-Token | Interne Integrationen | Konfigurierbar (Standard: 4h) |
| Integrationstoken | Drittanbieter-Apps | Bis zum Widerruf |
| OAuth 1.0a | Öffentliche Marktplatz-Apps | Bis zum Widerruf |
| Kunden-Token | Kundenorientierte Apps | Konfigurierbar |
Schritt 3: Admin-Token abrufen (einfachste Methode)
Admin-Token per REST-Endpoint generieren:
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('Invalid admin credentials');
const token = await response.text();
return token;
};
// Verwendung
const token = await getAdminToken();
console.log(`Admin token: ${token}`);
// Token sicher speichern
Token-Speicherung (.env Beispiel):
# .env file
MAGENTO_BASE_URL="https://store.example.com"
MAGENTO_ADMIN_USERNAME="api_user"
MAGENTO_ADMIN_PASSWORD="secure_password_here"
MAGENTO_ACCESS_TOKEN="obtained_via_auth"
Schritt 4: Integration erstellen (für Drittanbieter empfohlen)
- Navigiere zu System > Erweiterungen > Integrationen
- Klicke auf Neue Integration hinzufügen
- Details ausfüllen:
- Name: „Meine Integration“
- E-Mail: ihre-email@beispiel.de
- Callback-URL, Identitätslink-URL (für OAuth)
- API-Berechtigungen festlegen (Produkte, Bestellungen, Kunden, Inventar)
- Speichern und Aktivieren
- Zugriffstoken und Token Secret kopieren
Schritt 5: Kunden-Token abrufen
Für kundenorientierte Anwendungen:
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('Invalid customer credentials');
const token = await response.text();
return token;
};
// Verwendung
const customerToken = await getCustomerToken('customer@example.com', 'password123');
Schritt 6: Authentifizierte API-Aufrufe tätigen
Schreibe einen wiederverwendbaren API-Client:
const magentoRequest = async (endpoint, options = {}) => {
const token = await getAdminToken();
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(`Magento API Error: ${error.message}`);
}
return response.json();
};
// Beispiel:
const products = await magentoRequest('/V1/products');
console.log(`Found ${products.items.length} products`);
Produktverwaltung
Produkte abrufen
Mit Filtern Produkte abfragen:
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;
};
// Beispiel:
const products = await getProducts({ search: 'shirt', priceFrom: 20, limit: 50 });
products.items.forEach(product => {
console.log(`${product.sku}: ${product.name} - $${product.price}`);
});
Einzelnes Produkt abrufen
const getProduct = async (sku) => {
const response = await magentoRequest(`/V1/products/${sku}`);
return response;
};
// Beispiel:
const product = await getProduct('TSHIRT-001');
console.log(`Name: ${product.name}`);
console.log(`Price: $${product.price}`);
console.log(`Stock: ${product.extension_attributes?.stock_item?.qty}`);
Ein Produkt erstellen
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;
};
// Beispiel:
const newProduct = await createProduct({
sku: 'TSHIRT-NEW-001',
name: 'Premium Cotton T-Shirt',
price: 29.99,
qty: 100,
description: 'High-quality cotton t-shirt',
shortDescription: 'Premium cotton tee',
color: 'Blue',
size: 'M'
});
console.log(`Product created: ${newProduct.id}`);
Ein Produkt aktualisieren
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;
};
// Beispiel – Preis und Lagerbestand aktualisieren
await updateProduct('TSHIRT-001', {
price: 24.99,
extension_attributes: {
stock_item: {
qty: 150,
is_in_stock: true
}
}
});
Ein Produkt löschen
const deleteProduct = async (sku) => {
await magentoRequest(`/V1/products/${sku}`, {
method: 'DELETE'
});
console.log(`Product ${sku} deleted`);
};
Produkttypen
| Typ | Beschreibung | Anwendungsfall |
|---|---|---|
| Einfach | Eine SKU, keine Varianten | Standardprodukte |
| Konfigurierbar | Übergeordnet mit Varianten | Größen-/Farboptionen |
| Gruppiert | Sammlung einfacher Produkte | Produktbündel |
| Virtuell | Nicht-physische Produkte | Dienste, Downloads |
| Bündel | Anpassbare Produktbündel | Zusammenstellbare Kits |
| Herunterladbar | Digitale Produkte | E-Books, Software |
Auftragsverwaltung
Bestellungen abrufen
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;
};
// Beispiel – Offene Bestellungen der letzten 7 Tage:
const orders = await getOrders({
status: 'pending',
dateFrom: '2026-03-18 00:00:00',
limit: 50
});
orders.items.forEach(order => {
console.log(`Order #${order.increment_id}: ${order.customer_email} - $${order.grand_total}`);
});
Einzelne Bestellung abrufen
const getOrder = async (orderId) => {
const response = await magentoRequest(`/V1/orders/${orderId}`);
return response;
};
// Beispiel:
const order = await getOrder(12345);
console.log(`Order #${order.increment_id}`);
console.log(`Status: ${order.status}`);
console.log(`Total: $${order.grand_total}`);
order.items.forEach(item => {
console.log(` - ${item.name} x ${item.qty_ordered}`);
});
Bestellstatus-Fluss
pending → processing → complete
→ canceled
→ on_hold
→ payment_review
Bestellstatus aktualisieren
const updateOrderStatus = async (orderId, newStatus) => {
// Direktes Status-Update benötigt Custom-Endpoint
// Workflow nutzen:
await magentoRequest(`/V1/orders/${orderId}/cancel`, { method: 'POST' });
await magentoRequest(`/V1/orders/${orderId}/hold`, { method: 'POST' });
await magentoRequest(`/V1/orders/${orderId}/unhold`, { method: 'POST' });
};
Rechnung erstellen
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;
};
// Beispiel – Vollständige Rechnung erzeugen:
const invoiceId = await createInvoice(12345, [], true, false, 'Danke für Ihre Bestellung!');
console.log(`Invoice created: ${invoiceId}`);
Sendung erstellen
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;
};
// Beispiel – Versand mit Tracking:
const shipmentId = await createShipment(12345, [], true, false, 'Ihre Bestellung wurde versendet!', [
{
track_number: '1Z999AA10123456784',
title: 'Tracking Number',
carrier_code: 'ups'
}
]);
console.log(`Shipment created: ${shipmentId}`);
Kundenverwaltung
Kunden abrufen
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;
};
// Beispiel:
const customers = await getCustomers({ email: 'customer@example.com' });
customers.items.forEach(customer => {
console.log(`${customer.firstname} ${customer.lastname} - ${customer.email}`);
});
Einen Kunden erstellen
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;
};
// Beispiel:
const newCustomer = await createCustomer({
email: 'newcustomer@example.com',
firstname: 'John',
lastname: 'Doe',
password: 'SecurePass123!',
subscribed: true
});
console.log(`Customer created: ID ${newCustomer.id}`);
Bestandsverwaltung (MSI)
Lagerstatus abrufen
const getStockStatus = async (sku) => {
const response = await magentoRequest(`/V1/products/${sku}/stockItems/1`);
return response;
};
// Beispiel:
const stock = await getStockStatus('TSHIRT-001');
console.log(`Qty: ${stock.qty}`);
console.log(`In Stock: ${stock.is_in_stock}`);
console.log(`Min Qty: ${stock.min_qty}`);
Bestand aktualisieren
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;
};
// Beispiel:
await updateStock('TSHIRT-001', 100, true);
Webhooks und asynchrone Operationen
Webhooks einrichten
Magento hat keine nativen Webhooks. Alternativen:
// 1. Poll orders endpoint regelmäßig:
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 (nur Adobe Commerce)
// Events über Adobe Developer Console konfigurieren
// 3. Eigenes Webhook-Modul entwickeln
// Siehe: https://devdocs.magento.com/guides/v2.4/extension-dev-guide/message-queues/message-queues.html
Ratenbegrenzung
Ratenbegrenzungen verstehen
- Standard: Keine Begrenzung (im Admin konfigurierbar)
- Empfohlen: 100-1000 Anfragen/Minute
Konfiguriere im Admin unter Stores > Konfiguration > Dienste > Web API > Sicherheit
Implementierung der Ratenbegrenzungsbehandlung
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;
}
}
}
};
Checkliste für die Produktivbereitstellung
Vor Live-Schaltung:
- [ ] Integrationstoken (nicht Admin-Anmeldeinformationen) in der Produktion verwenden
- [ ] Token sicher speichern (verschlüsselte Datenbank)
- [ ] Ratenbegrenzung und Anfragen-Warteschlangen implementieren
- [ ] Umfassende Fehlerbehandlung hinzufügen
- [ ] Protokollierung für alle API-Aufrufe einrichten
- [ ] Webhook-Alternative erstellen (Polling oder Adobe I/O)
- [ ] Mit Produktionsdatenvolumen testen
- [ ] Wiederholungslogik für fehlgeschlagene Anfragen implementieren
Praxisbeispiele
ERP-Integration
- Herausforderung: Manuelle Bestandsaktualisierungen zwischen ERP und Magento
- Lösung: Bidirektionale API-Synchronisation alle 15 Minuten
- Ergebnis: Echtzeit-Bestand, kein Überverkauf
Mobile App
- Herausforderung: Native mobile Erfahrung erforderlich
- Lösung: GraphQL API für Produktanzeige, REST für Checkout
- Ergebnis: 40% Steigerung der mobilen Konversion
Fazit
Die Magento 2 API bietet umfassende E-Commerce-Funktionalität. Wichtig für die Praxis:
- REST-, SOAP- und GraphQL-APIs verfügbar
- Token-basierte Authentifizierung für Integrationen
- Volle CRUD-Operationen für Produkte, Bestellungen, Kunden
- MSI für erweiterte Bestandsverwaltung
- Ratenbegrenzungen pro Installation konfigurierbar
- Apidog optimiert API-Tests und Team-Kollaboration
FAQ-Bereich
Wie authentifiziere ich mich bei der Magento API?
Verwende einen Admin-Token für interne Integrationen oder erstelle eine Integration unter System > Erweiterungen für OAuth. Kunden-Token für kundenorientierte Apps.
Was ist der Unterschied zwischen REST und GraphQL in Magento?
REST bietet vollständige CRUD-Operationen. GraphQL ist für Frontend-Abfragen mit effizienter Datenabfrage optimiert.
Wie erstelle ich ein Produkt über die API?
POST an /V1/products mit Produktdaten, einschließlich SKU, Name, Preis und stock_item in den extension_attributes.
Kann ich Webhooks für neue Bestellungen erhalten?
Magento hat keine nativen Webhooks. Verwende Polling, Adobe I/O Events (Adobe Commerce) oder entwickle ein benutzerdefiniertes Modul.
Wie aktualisiere ich Bestandsmengen?
PUT an /V1/products/{sku}/stockItems/1 mit den Werten für qty und is_in_stock.
Top comments (0)