Dropshipping API
Integrieren Sie Ihren Shop oder Ihr ERP-System mit Tormino über unsere REST-API. Bestellungen automatisch aufgeben, Bestand in Echtzeit synchronisieren und Ihr Wallet-Guthaben verwalten.
Inhaltsverzeichnis
Authentifizierung
Alle API-Anfragen erfordern einen API-Schlüssel (Bearer Token). Sie erhalten diesen nach Genehmigung Ihres Dropshipping-Antrags.
# Header format - Orders & Stock API Authorization: Bearer YOUR_API_KEY Content-Type: application/json # Header format - Wallet API (Shopwaive) X-Shopwaive-Access-Token: YOUR_SHOPWAIVE_API_KEY X-Shopwaive-Platform: shopify Content-Type: application/json
https://api.tormino.com/dropship/v1Wallet API:
https://app.shopwaive.com/api
Bestellungen aufgeben
Platzieren Sie eine neue Bestellung aus Ihrem System direkt in unserem Lager. Die Bestellung wird nur bei ausreichendem Wallet-Guthaben und Bestand erstellt.
Anfrage
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
| reference | string | Ja | Ihre interne Bestellreferenz |
| shipping.name | string | Ja | Vollständiger Name des Endkunden |
| shipping.address1 | string | Ja | Straße und Hausnummer |
| shipping.address2 | string | Nein | Zusätzliche Adresszeile |
| shipping.city | string | Ja | Stadt |
| shipping.zip | string | Ja | Postleitzahl |
| shipping.country | string | Ja | ISO 3166-1 alpha-2 (NL, BE, DE, FR) |
| shipping.phone | string | Nein | Telefon des Endkunden |
| shipping.email | string | Nein | E-Mail des Endkunden |
| items[].ean | string | Ja | Produkt-EAN-Code |
| items[].sku | string | Nein | Produkt-SKU (Fallback wenn EAN fehlt) |
| items[].quantity | integer | Ja | Zu bestellende Menge |
// POST /orders { "reference": "ORD-2024-12345", "shipping": { "name": "Jan Jansen", "address1": "Kerkstraat 1", "address2": "", "city": "Amsterdam", "zip": "1011AB", "country": "NL", "phone": "+31612345678", "email": "jan@example.com" }, "items": [ { "ean": "8711234567890", "quantity": 2 } ] }
Antwort 200 OK
{
"order_id": "TORM-500123",
"status": "confirmed",
"wallet_balance_after": 425.50,
"currency": "EUR",
"estimated_ship_date": "2026-07-17"
}
Antwort 402 Payment Required
{
"error": "insufficient_wallet_balance",
"message": "Insufficient balance. Current: EUR 25.00. Required: EUR 74.50.",
"wallet_balance": 25.00,
"amount_required": 74.50,
"top_up_url": "https://tormino.nl/pages/b2b-dashboard#wallet"
}
Antwort 409 Conflict
{
"error": "insufficient_stock",
"message": "Item 8711234567890 has insufficient stock.",
"item_ean": "8711234567890",
"requested": 2,
"available": 1
}
Idempotency-Key Header hinzu, um doppelte Bestellungen bei Wiederholungen zu vermeiden. Gleicher Key = keine doppelte Bestellung.Bestand synchronisieren
Prüfen Sie die Echtzeit-Verfügbarkeit von Artikeln, bevor Sie sie in Ihrem Shop anbieten.
Einzelartikel
{
"ean": "8711234567890",
"sku": "TORM-12345",
"available": true,
"quantity": 47,
"lead_time_days": 1
}
Batch (max 100 pro Anfrage)
// Request { "eans": ["8711234567890", "8711234567891"] } // Response { "items": [ { "ean": "8711234567890", "available": true, "quantity": 47 }, { "ean": "8711234567891", "available": false, "quantity": 0 } ] }
Wallet verwalten
Rufen Sie Ihr aktuelles Guthaben und die Transaktionshistorie ab oder laden Sie Ihr Wallet per iDeal auf.
Guthaben & Transaktionen
# Headers X-Shopwaive-Access-Token: YOUR_SHOPWAIVE_API_KEY X-Shopwaive-Platform: shopify Content-Type: application/json # Response { "balance": 425.50, "activity": [ { "id": "action_739281", "type": "deposit", "amount": 500.00, "note": "Top-up via iDeal", "date": "2026-07-15T14:00:00Z", "status": "active" }, { "id": "action_739282", "type": "withdrawal", "amount": -74.50, "note": "Order TORM-500123", "date": "2026-07-16T10:30:00Z", "status": "active" } ] }
?activity=true fuer Transaktionsverlauf, ?orders=true fuer verknuepfte Shopify-Bestellungen.
Aufladen
// Programmatore top-up (via Shopwaive API) PUT /customer X-Shopwaive-Access-Token: YOUR_SHOPWAIVE_API_KEY X-Shopwaive-Platform: shopify { "email": "partner@example.com", "amount": 500.00 }
Bestellübersicht
Sehen Sie Ihre letzten Bestellungen mit Erfüllungsstatus und Trackingnummer.
{
"orders": [
{
"order_id": "TORM-500123",
"reference": "ORD-2024-12345",
"status": "fulfilled",
"tracking_number": "3S1234567890",
"tracking_carrier": "PostNL",
"total": 74.50,
"created_at": "2026-07-16T10:30:00Z",
"shipped_at": "2026-07-17T09:15:00Z"
}
]
}
status (confirmed, shipped, cancelled), limit (max 50), offset für Paginierung.Webhooks
Wir senden Benachrichtigungen an Ihre konfigurierte Webhook-URL bei Bestellstatusänderungen.
| Event | Auslöser | Payload |
|---|---|---|
| order.confirmed | Bestellung erstellt + Wallet abgebucht | order_id, amount, wallet_balance_after |
| order.shipped | Erfüllung in Shopify erstellt | order_id, tracking_number, tracking_carrier |
| order.cancelled | Bestellung storniert | order_id, reason, refund_amount |
| wallet.low_balance | Guthaben fällt unter Schwellenwert | balance, threshold, top_up_url |
Webhook-Verifizierung
// Verify HMAC-SHA256 signature X-Tormino-Signature: sha256=hex_signature // Pseudocode expected = HMAC_SHA256(webhook_secret, raw_body) if expected == received_signature: process_webhook(payload) else: reject()
Fehlerbehandlung
Die API verwendet standardmäßig HTTP-Statuscodes. Fehlerantworten enthalten einen maschinenlesbaren Fehlercode.
| Code | Fehler | Beschreibung |
|---|---|---|
| 401 | unauthorized | Fehlender oder ungültiger API-Schlüssel |
| 402 | insufficient_wallet_balance | Wallet-Guthaben zu niedrig für Bestellung |
| 404 | product_not_found | EAN/SKU nicht im Katalog gefunden |
| 409 | insufficient_stock | Angeforderte Menge überschreitet verfügbaren Bestand |
| 422 | validation_error | Fehlende oder ungültige Anfragefelder |
| 429 | rate_limit_exceeded | Zu viele Anfragen (max 100/Min) |
| 500 | internal_error | Serverfehler - Wiederholung mit Backoff |
Code-Beispiele
Fertige Beispiele für das Aufgeben einer Bestellung in den am häufigsten verwendeten Sprachen.
$payload = [ 'reference' => 'ORD-2024-12345', 'shipping' => [ 'name' => 'Jan Jansen', 'address1' => 'Kerkstraat 1', 'city' => 'Amsterdam', 'zip' => '1011AB', 'country' => 'NL', ], 'items' => [ ['ean' => '8711234567890', 'quantity' => 2], ], ]; $ch = curl_init('https://api.tormino.com/dropship/v1/orders'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload)); curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Authorization: Bearer YOUR_API_KEY', 'Content-Type: application/json', 'Idempotency-Key: ' . uniqid(), ]); $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($httpCode === 200) { $result = json_decode($response, true); echo "Order confirmed: " . $result['order_id']; } elseif ($httpCode === 402) { echo "Insufficient wallet balance"; } curl_close($ch);
import requests import uuid payload = { "reference": "ORD-2024-12345", "shipping": { "name": "Jan Jansen", "address1": "Kerkstraat 1", "city": "Amsterdam", "zip": "1011AB", "country": "NL", }, "items": [ {"ean": "8711234567890", "quantity": 2}, ], } headers = { "Authorization": "Bearer YOUR_API_KEY", "Content-Type": "application/json", "Idempotency-Key": str(uuid.uuid4()), } response = requests.post( "https://api.tormino.com/dropship/v1/orders", json=payload, headers=headers, ) if response.status_code == 200: data = response.json() print(f"Order confirmed: {data['order_id']}") elif response.status_code == 402: print("Insufficient wallet balance")
const response = await fetch('https://api.tormino.com/dropship/v1/orders', { method: 'POST', headers: { 'Authorization': 'Bearer YOUR_API_KEY', 'Content-Type': 'application/json', 'Idempotency-Key': crypto.randomUUID(), }, body: JSON.stringify({ reference: 'ORD-2024-12345', shipping: { name: 'Jan Jansen', address1: 'Kerkstraat 1', city: 'Amsterdam', zip: '1011AB', country: 'NL', }, items: [ { ean: '8711234567890', quantity: 2 }, ], }), }); const data = await response.json(); if (response.ok) { console.log(`Order confirmed: ${data.order_id}`); } else if (response.status === 402) { console.log('Insufficient wallet balance'); }
Rate Limits & Best Practices
Maximal 100 Anfragen pro Minute pro API-Schlüssel. Verwenden Sie Batch-Endpoints für Bestandsprüfungen.
| Limit | Wert |
|---|---|
| Anfragen pro Minute | 100 pro API-Schlüssel |
| Anfragen pro Stunde | 1000 pro API-Schlüssel |
| Batch-Bestandsprüfung | Max 100 EANs pro Anfrage |
| Bestellungen pro Anfrage | 1 (eine Bestellung pro API-Aufruf) |
| Rate-Limit-Header | X-RateLimit-Remaining, X-RateLimit-Reset |
Idempotency-Key zu Bestellanfragen hinzu für sichere Wiederholungen bei Netzwerkfehlern.