Vor 12:00 Uhr bestellt = am nächsten Werktag versendet*

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.

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
Basis-URL: https://api.tormino.com/dropship/v1
Wallet API: https://app.shopwaive.com/api
↑ Zurück nach oben

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.

POST /orders

Anfrage

ParameterTypErforderlichBeschreibung
referencestringJaIhre interne Bestellreferenz
shipping.namestringJaVollständiger Name des Endkunden
shipping.address1stringJaStraße und Hausnummer
shipping.address2stringNeinZusätzliche Adresszeile
shipping.citystringJaStadt
shipping.zipstringJaPostleitzahl
shipping.countrystringJaISO 3166-1 alpha-2 (NL, BE, DE, FR)
shipping.phonestringNeinTelefon des Endkunden
shipping.emailstringNeinE-Mail des Endkunden
items[].eanstringJaProdukt-EAN-Code
items[].skustringNeinProdukt-SKU (Fallback wenn EAN fehlt)
items[].quantityintegerJaZu 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

Bei unzureichendem Guthaben wird die Bestellung abgelehnt (HTTP 402). Es wird keine Bestellung erstellt.
{
  "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
}
Idempotenz: Fügen Sie einen Idempotency-Key Header hinzu, um doppelte Bestellungen bei Wiederholungen zu vermeiden. Gleicher Key = keine doppelte Bestellung.
↑ Zurück nach oben

Bestand synchronisieren

Prüfen Sie die Echtzeit-Verfügbarkeit von Artikeln, bevor Sie sie in Ihrem Shop anbieten.

Einzelartikel

GET /stock/{ean}
{
  "ean": "8711234567890",
  "sku": "TORM-12345",
  "available": true,
  "quantity": 47,
  "lead_time_days": 1
}

Batch (max 100 pro Anfrage)

POST /stock/batch
// Request
{ "eans": ["8711234567890", "8711234567891"] }

// Response
{
  "items": [
    { "ean": "8711234567890", "available": true, "quantity": 47 },
    { "ean": "8711234567891", "available": false, "quantity": 0 }
  ]
}
↑ Zurück nach oben

Wallet verwalten

Rufen Sie Ihr aktuelles Guthaben und die Transaktionshistorie ab oder laden Sie Ihr Wallet per iDeal auf.

Powered by Shopwaive — Wallet-Endpunkte verwenden die Shopwaive REST API mit separater Authentifizierung.

Guthaben & Transaktionen

GET /customer/{email}?activity=true
# 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"
    }
  ]
}
Parameter: ?activity=true fuer Transaktionsverlauf, ?orders=true fuer verknuepfte Shopify-Bestellungen.

Aufladen

Mindestaufladung betraegt EUR 100. Guthaben verfaellt nicht.
GET /products/wallet-opwaarderen
Aufladungen erfolgen ueber den normalen Shopify Checkout. Kaufen Sie das Wallet-Auflade-Produkt, waehlen Sie den Betrag und zahlen Sie mit iDeal. Nach der Zahlung wird das Guthaben automatisch ueber Shopwaive + Shopify Flow aktualisiert.
// 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 }
↑ Zurück nach oben

Bestellübersicht

Sehen Sie Ihre letzten Bestellungen mit Erfüllungsstatus und Trackingnummer.

GET /orders?status=confirmed&limit=20
{
  "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"
    }
  ]
}
Query-Parameter: status (confirmed, shipped, cancelled), limit (max 50), offset für Paginierung.
↑ Zurück nach oben

Webhooks

Wir senden Benachrichtigungen an Ihre konfigurierte Webhook-URL bei Bestellstatusänderungen.

EventAuslöserPayload
order.confirmedBestellung erstellt + Wallet abgebuchtorder_id, amount, wallet_balance_after
order.shippedErfüllung in Shopify erstelltorder_id, tracking_number, tracking_carrier
order.cancelledBestellung storniertorder_id, reason, refund_amount
wallet.low_balanceGuthaben fällt unter Schwellenwertbalance, 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()
↑ Zurück nach oben

Fehlerbehandlung

Die API verwendet standardmäßig HTTP-Statuscodes. Fehlerantworten enthalten einen maschinenlesbaren Fehlercode.

CodeFehlerBeschreibung
401unauthorizedFehlender oder ungültiger API-Schlüssel
402insufficient_wallet_balanceWallet-Guthaben zu niedrig für Bestellung
404product_not_foundEAN/SKU nicht im Katalog gefunden
409insufficient_stockAngeforderte Menge überschreitet verfügbaren Bestand
422validation_errorFehlende oder ungültige Anfragefelder
429rate_limit_exceededZu viele Anfragen (max 100/Min)
500internal_errorServerfehler - Wiederholung mit Backoff
↑ Zurück nach oben

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');
}
↑ Zurück nach oben

Rate Limits & Best Practices

Maximal 100 Anfragen pro Minute pro API-Schlüssel. Verwenden Sie Batch-Endpoints für Bestandsprüfungen.

LimitWert
Anfragen pro Minute100 pro API-Schlüssel
Anfragen pro Stunde1000 pro API-Schlüssel
Batch-BestandsprüfungMax 100 EANs pro Anfrage
Bestellungen pro Anfrage1 (eine Bestellung pro API-Aufruf)
Rate-Limit-HeaderX-RateLimit-Remaining, X-RateLimit-Reset
Best Practice: Synchronisieren Sie den Bestand alle 15-30 Minuten über den Batch-Endpoint. Verwenden Sie Webhooks für Bestellstatus-Updates statt Polling. Fügen Sie immer Idempotency-Key zu Bestellanfragen hinzu für sichere Wiederholungen bei Netzwerkfehlern.