Produkte-API
Die Produkte-API dient der effizienten Verwaltung von Produktdaten innerhalb einer E-Commerce-Umgebung. Sie unterstützt das Erstellen, Ändern und Löschen von Produkten und verwaltet dabei Preisdetails, Lagerinformationen, Wiederholungseinstellungen, Steuern und die Bildverwaltung.
Die API sorgt für klare und konsistente Antworten, einschließlich detaillierter Fehlerbehandlung und Unterstützung für mehrere Währungen mit korrekter Präzisionsprüfung.
Ein Produkt erstellen¶
Endpunkt
POST /v1/products/
Dieser Endpunkt ermöglicht das Erstellen eines neuen Produkts im System durch Senden einer POST-Anfrage mit den Produktdetails – wie Name, Beschreibung, Preis, Währung, Lagerbestand, Steuern, Bilder und Wiederholungseinstellungen.
Query-Parameter:
| Parameter | Beschreibung | Typ | Erforderlich |
|---|---|---|---|
| test | Gibt an, ob sich das Produkt im Testmodus befindet | boolean | nein |
Felder im Request-Body:
| Parameter | Beschreibung | Typ | Erforderlich |
|---|---|---|---|
| name | Produktname (max. 50 Zeichen) | string | ja |
| short_description | Kurze Produktbeschreibung (max. 100 Zeichen) | string | nein |
| description | Detaillierte Produktbeschreibung (max. 300 Zeichen) | string | nein |
| price | Produktpreis (validiert nach Währung) | decimal | ja |
| currency | Währungscode (USD, EUR, CRC etc.) | string | nein |
| stock | Anzahl der Artikel auf Lager | integer | nein |
| is_physical | Ob das Produkt physisch ist (true/false) | boolean | nein |
| bar_code | Produkt-Barcode | string | nein |
| sku | Lagerhaltungseinheit (Stock keeping unit) | string | nein |
| taxes | Kommagetrennte Steuer-IDs | string | nein |
| recurrence | Wiederholungseinstellungen (JSON-Objekt) | object | nein |
Format des Wiederholungsobjekts:
{
"recurrence": "period", // oder "specific_billing_day"
"duration_period": 1 // Gültig: 1, 2, 3, 4, 6, 12 (Monate)
}
Oder:
Parameter für den Datei-Upload:
| Parameter | Beschreibung | Typ | Erforderlich |
|---|---|---|---|
| image_default | Standard-Produktbild (Datei) | file | nein |
| images | Zusätzliche Produktbilder (max. 4) | file | nein |
Anfrage:
curl -X POST 'https://api.4geeks.io/v1/products/?test=false' \
-u 'sk_test_51O62xYzAbcDef123:' \
-F 'name=Premium Widget' \
-F 'description=This is a premium widget product' \
-F 'price=99.99' \
-F 'currency=USD' \
-F 'stock=50' \
-F 'is_physical=true' \
-F 'taxes=1,3' \
-F 'sku=PREMIUM-WIDGET-001' \
-F 'image_default=@/path/to/image.jpg' \
-F 'recurrence={"recurrence":"period","duration_period":3}'
Antwort (201 Created):
{
"code": 201,
"title": "Registrierung abgeschlossen",
"content": "Die Registrierung wurde erfolgreich abgeschlossen.",
"type": "success",
"data": {
"id": "d36a4a5c-9fa9-4d55-b47f-4f1d50f2a180"
}
}
Alle Produkte abrufen¶
Endpunkt
GET /v1/products/
Dieser Endpunkt ruft eine paginierte Liste aller Produkte mit erweiterter Filterunterstützung ab. Unterstützt Pagination, Suche, Filterung nach Typ, Preisspanne und Lagerbestand.
Query-Parameter:
| Parameter | Beschreibung | Typ | Erforderlich |
|---|---|---|---|
| page | Die abzurufende Seitennummer (Standard: 1) | integer | nein |
| page_size | Produkte pro Seite (Standard: 10, max: 100) | integer | nein |
| test | Nach Testmodus filtern (true/false) | boolean | nein |
| search | Suche nach Name oder SKU | string | nein |
| type | Filter nach Typ (physisch/digital) | string | nein |
| stock_min | Minimaler Lagerbestand | integer | nein |
| stock_max | Maximaler Lagerbestand | integer | nein |
| price_min | Mindestpreis (in Produktwährung) | decimal | nein |
| price_max | Höchstpreis (in Produktwährung) | decimal | nein |
Anfrage:
curl -X GET 'https://api.4geeks.io/v1/products/?page=1&page_size=10&test=false' \
-u 'sk_test_51O62xYzAbcDef123:'
Anfrage (Mit Filtern):
curl -X GET 'https://api.4geeks.io/v1/products/?page=1&search=widget&type=physical&price_min=10&price_max=100&stock_min=5' \
-u 'sk_test_51O62xYzAbcDef123:'
Antwort (200 OK):
{
"count": 25,
"current_page": 1,
"total_pages": 3,
"results": [
{
"id": "a232cccc-956a-44ca-a2e8-d763afddc89f",
"name": "Premium Widget",
"short_description": "Hochwertiges Widget",
"description": "Dies ist ein Premium-Widget-Produkt mit erweiterten Funktionen",
"stock": 50,
"price": "99.99",
"currency": "USD",
"total_price": "109.99",
"is_physical": true,
"bar_code": "123456789012",
"sku": "PREMIUM-WIDGET-001",
"recurrence": {
"recurrence": "period",
"duration_period": 3
},
"images": {
"default": "https://storage.googleapis.com/bucket/image-default.jpg",
"additional_images": [
{"image": "https://storage.googleapis.com/bucket/image-1.jpg"},
{"image": "https://storage.googleapis.com/bucket/image-2.jpg"}
]
},
"payment_link": false,
"created_on": "2025-12-04T10:30:00Z",
"test": false,
"taxes": [
{"id": 1, "name": "MwSt.", "value": 10.0}
]
}
]
}
Ein bestimmtes Produkt abrufen¶
Endpunkt
GET /v1/products/{id}/
Dieser Endpunkt ruft die vollständigen Details eines bestimmten Produkts anhand seiner eindeutigen ID ab.
Pfad-Parameter:
| Parameter | Beschreibung | Typ | Erforderlich |
|---|---|---|---|
| id | Die eindeutige Kennung eines Produkts (UUID) | string | ja |
Query-Parameter:
| Parameter | Beschreibung | Typ | Erforderlich |
|---|---|---|---|
| test | Nach Testmodus filtern (true/false) | boolean | nein |
Anfrage:
curl -X GET 'https://api.4geeks.io/v1/products/f9b77185-a62e-4da9-a056-3c7b812ca334/?test=false' \
-u 'sk_test_51O62xYzAbcDef123:'
Antwort (200 OK):
{
"id": "f9b77185-a62e-4da9-a056-3c7b812ca334",
"name": "Premium Widget",
"short_description": "Hochwertiges Widget",
"description": "Dies ist ein Premium-Widget-Produkt mit erweiterten Funktionen",
"stock": 50,
"price": "99.99",
"currency": "USD",
"total_price": "109.99",
"is_physical": true,
"bar_code": "123456789012",
"sku": "PREMIUM-WIDGET-001",
"recurrence": {
"recurrence": "period",
"duration_period": 3
},
"images": {
"default": "https://storage.googleapis.com/bucket/image-default.jpg",
"additional_images": [
{"image": "https://storage.googleapis.com/bucket/image-1.jpg"},
{"image": "https://storage.googleapis.com/bucket/image-2.jpg"}
]
},
"payment_link": false,
"created_on": "2025-12-04T10:30:00Z",
"test": false,
"taxes": [
{"id": 1, "name": "MwSt.", "value": 10.0}
]
}
Ein Produkt aktualisieren¶
Endpunkt
PUT /v1/products/{id}/
Aktualisiert ein bestehendes Produkt mit neuen Details. Sie können einzelne Felder aktualisieren, ohne andere zu beeinflussen.
Pfad-Parameter:
| Parameter | Beschreibung | Typ | Erforderlich |
|---|---|---|---|
| id | Die eindeutige Kennung eines Produkts (UUID) | string | ja |
Query-Parameter:
| Parameter | Beschreibung | Typ | Erforderlich |
|---|---|---|---|
| test | Nach Testmodus filtern (true/false) | boolean | nein |
Felder im Request-Body (alle optional):
| Parameter | Beschreibung | Typ |
|---|---|---|
| name | Produktname (max. 50 Zeichen) | string |
| short_description | Kurze Produktbeschreibung (max. 100 Zeichen) | string |
| description | Detaillierte Produktbeschreibung (max. 300 Zeichen) | string |
| price | Produktpreis (validiert nach Währung) | decimal |
| currency | Währungscode (USD, EUR, CRC etc.) | string |
| stock | Anzahl der Artikel auf Lager | integer |
| is_physical | Ob das Produkt physisch ist (true/false) | boolean |
| bar_code | Produkt-Barcode | string |
| sku | Lagerhaltungseinheit (Stock keeping unit) | string |
| taxes | Kommagetrennte Steuer-IDs | string |
| payment_link | Als Zahlungslink aktivieren | boolean |
Flags für die Bildverwaltung:
| Parameter | Wert | Aktion |
|---|---|---|
| default | -1 | Bestehendes Standardbild beibehalten |
| default | -remove- | Standardbild entfernen |
| default | <Datei> | Durch neues Bild ersetzen |
| additional_images | -1 | Bestehende zusätzliche Bilder beibehalten |
| additional_images | -remove- | Alle zusätzlichen Bilder entfernen |
| additional_images | <Dateien> | Durch neue Bilder ersetzen (max. 4) |
Anfrage:
curl -X PUT 'https://api.4geeks.io/v1/products/f9b77185-a62e-4da9-a056-3c7b812ca334/?test=false' \
-u 'sk_test_51O62xYzAbcDef123:' \
-F 'name=Updated Widget Name' \
-F 'description=Updated description' \
-F 'price=79.99' \
-F 'stock=100' \
-F 'default=-1'
Antwort (200 OK):
{
"code": 200,
"title": "Produkt aktualisiert",
"content": "Das Produkt wurde erfolgreich aktualisiert.",
"type": "success",
"data": {
"id": "f9b77185-a62e-4da9-a056-3c7b812ca334",
"name": "Updated Widget Name",
"description": "Updated description",
"price": "79.99",
"stock": 100,
"total_price": "87.99"
}
}
Ein Produkt löschen¶
Endpunkt
DELETE /v1/products/{id}/
Löscht ein Produkt dauerhaft und deaktiviert es.
Pfad-Parameter:
| Parameter | Beschreibung | Typ | Erforderlich |
|---|---|---|---|
| id | Die eindeutige Kennung eines Produkts (UUID) | string | ja |
Query-Parameter:
| Parameter | Beschreibung | Typ | Erforderlich |
|---|---|---|---|
| test | Nach Testmodus filtern (true/false) | boolean | nein |
Anfrage:
curl -X DELETE 'https://api.4geeks.io/v1/products/f9b77185-a62e-4da9-a056-3c7b812ca334/?test=false' \
-u 'sk_test_51O62xYzAbcDef123:'
Antwort (200 OK):
{
"code": 200,
"title": "Produkt gelöscht",
"content": "Das Produkt wurde erfolgreich gelöscht.",
"type": "success"
}
Fehlerbehandlung¶
Die API gibt Standard-HTTP-Statuscodes zurück, um den Erfolg oder Misserfolg einer Anfrage anzuzeigen. Nachfolgend sind häufige Fehler aufgeführt, die spezifisch für Produkte sind:
400 Bad Request¶
Tritt auf, wenn die Anfrage fehlerhaft ist oder ungültige Daten enthält.
Szenarien:
| Szenario | Fehlermeldung | Lösung |
|---|---|---|
| Ungültiges Preisformat | "Price validation error: {message}" | Überprüfen Sie die Preispräzision für die Währung (z. B. JPY verwendet 0 Dezimalstellen) |
| Ungültiges Wiederholungs-JSON | "Please check the format of recurrence, remember that it is a JSON object." | Stellen Sie sicher, dass die Wiederholung im gültigen JSON-Format vorliegt |
| Ungültiger Zeitraum | "The duration_period can contain only the following values 1, 2, 3, 4, 6, 12" | Verwenden Sie gültige Monatszeiträume: 1, 2, 3, 4, 6 oder 12 |
| Ungültiger Zahltag | "The payday has to be greater than 0 and less than or equal to 28." | Verwenden Sie einen Tag zwischen 1 und 28 |
Beispiel für eine Fehlerantwort:
{
"code": 400,
"title": "Ungültiges Preisformat",
"content": "Preisvalidierungsfehler: JPY benötigt 0 Dezimalstellen. Bitte passen Sie den Preis entsprechend den Währungsanforderungen an.",
"type": "danger"
}
401 Unauthorized¶
Authentifizierung fehlgeschlagen. Der API-Key ist ungültig, fehlt oder ist fehlerhaft.
Beispiel:
Lösung: - Überprüfen Sie, ob Sie den Parameter -u 'sk_test_...: oder den Header Authorization: Basic hinzugefügt haben - Stellen Sie sicher, dass Ihr API-Key korrekt und aktiv ist - Testen Sie mit Postman unter Verwendung von Basic Auth
404 Not Found¶
Das angeforderte Produkt existiert nicht.
Beispiel:
{
"code": 404,
"title": "Produkt existiert nicht",
"content": "Die ID 'f9b77185-a62e-4da9-a056-3c7b812ca334' entspricht keinem Produkt",
"type": "danger"
}
Lösung: - Überprüfen Sie, ob die Produkt-ID existiert - Verwenden Sie den List-Endpunkt, um die korrekte Produkt-ID zu finden - Stellen Sie sicher, dass das Produkt zu Ihrem Entwicklerkonto gehört
406 Not Acceptable¶
Die Anfrage verstößt gegen Geschäftsregeln oder Validierungsbeschränkungen.
Beispiel:
{
"code": 406,
"title": "Fehler bei der Produktregistrierung",
"content": "Registrierung des Produkts fehlgeschlagen, bitte prüfen: Ungültige Feldwerte",
"type": "danger"
}
Wichtige Hinweise¶
Preisvalidierung
- Preise werden basierend auf den Dezimalstellen der Währung validiert
- JPY, CLP und ähnliche Währungen verwenden 0 Dezimalstellen
- USD, EUR, GBP verwenden 2 Dezimalstellen
- KWD und ähnliche Währungen verwenden 3 Dezimalstellen
Bildverwaltung
- Standardbild: Wird als primäres Produktbild angezeigt
- Zusätzliche Bilder: Bis zu 4 zusätzliche Bilder werden unterstützt
- Unterstützte Formate: JPEG, PNG
- Maximale Dateigröße: 10 MB pro Bild
- Verwenden Sie spezielle Flags (
-1,-remove-), um bestehende Bilder zu verwalten
Steuern
- Auf Produkte können mehrere Steuern angewendet werden
- Der Gesamtpreis beinhaltet die Steuerberechnungen
- Steuern sind über ihre IDs verknüpft
- Senden Sie kommagetrennte Steuer-IDs:
"taxes": "1,3,5"
Wiederholungseinstellungen
period: Feste monatliche Wiederholung (1, 2, 3, 4, 6 oder 12 Monate)specific_billing_day: Monatlich an einem bestimmten Tag (1-28)- Diese Einstellungen gelten, wenn das Produkt in Abonnements verwendet wird
Test vs. Produktion
- Verwenden Sie Ihren Test-Key (
sk_test_...) für die Entwicklung und zum Testen - Verwenden Sie Ihren Live-Key (
sk_live_...) für echte Transaktionen - Der Query-Parameter
?test=trueoder?test=falsesteuert den Modus - Das System erkennt den Modus automatisch anhand des verwendeten API-Keys
Best Practices¶
- Preise sorgfältig validieren – Stellen Sie sicher, dass die Preise den Anforderungen an die Dezimalstellen der Währung entsprechen
- Beschreibende Namen verwenden – Helfen Sie Kunden, Produkte klar zu verstehen
- Genauen Lagerbestand festlegen – Halten Sie die Inventarzahlen aktuell
- Bilder hinzufügen – Produktbilder erhöhen die Konversionsraten
- SKUs verwenden – Eindeutige SKUs helfen bei der Lagerverwaltung
- Steuern korrekt anwenden – Beziehen Sie alle anwendbaren Steuer-IDs ein
- Vor der Produktion testen – Verwenden Sie den Testmodus mit Test-API-Keys zur Validierung
- Wiederholung klug einsetzen – Legen Sie die Wiederholung nur für abonnementfähige Produkte fest
Fehlerbehebung¶
Problem: „Preisvalidierungsfehler: JPY benötigt 0 Dezimalstellen“¶
Ursache: Verwendung von Dezimalstellen, die von der Währung nicht unterstützt werden
Lösung: - JPY: Ganze Zahlen verwenden (keine Dezimalstellen) - USD/EUR: 2 Dezimalstellen verwenden (99.99) - KWD: 3 Dezimalstellen verwenden (99.999)
Problem: „Der duration_period kann nur die folgenden Werte enthalten: 1, 2, 3, 4, 6, 12“¶
Ursache: Ungültiger Wiederholungszeitraum angegeben
Lösung: - Verwenden Sie nur: 1 (monatlich), 2 (zweimonatlich), 3 (vierteljährlich), 4 (viermonatlich), 6 (halbjährlich) oder 12 (jährlich)
Problem: „Der payday muss größer als 0 und kleiner oder gleich 28 sein“¶
Ursache: Ungültiger Abrechnungstag angegeben
Lösung: - Der Zahltag muss zwischen 1 und 28 liegen - Die Tage 29-31 werden nicht unterstützt, um die monatliche Konsistenz zu gewährleisten
Problem: „Produkt existiert nicht“¶
Ursache: Produkt-ID existiert nicht oder gehört zu einem anderen Entwicklerkonto
Lösung: - Überprüfen Sie die Produkt-ID über den List-Endpunkt - Stellen Sie sicher, dass Sie den richtigen API-Key verwenden - Überprüfen Sie, ob das Produkt nicht gelöscht wurde
Problem: „Der angegebene Zustand ist ungültig“¶
Ursache: Ungültiger Produkttyp oder Filterwert
Lösung: - Verwenden Sie gültige Typwerte: „physical“ oder „digital“ - Stellen Sie sicher, dass die Filterparameter korrekt formatiert sind
- Noch Fragen? Get support.
- Check out the changelog.