Besteld voor 12:00u = volgende werkdag verzonden*

Dropshipping API

Integreer uw winkel of ERP-systeem met Tormino via onze REST API. Plaats orders automatisch, synchroniseer voorraad real-time en beheer uw wallet-saldo.

Authenticatie

Alle API-verzoeken vereisen een API-sleutel (Bearer token). U ontvangt deze na goedkeuring van uw dropshipping-aanvraag. Voeg de sleutel toe aan elke request header:

# 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
↑ Terug naar boven

Orders doorzetten

Plaats een nieuwe order vanuit uw systeem rechtstreeks in ons magazijn. De order wordt alleen aangemaakt bij voldoende wallet-saldo en voorraad.

POST /orders

Request

ParameterTypeVerplichtBeschrijving
referencestringJaUw interne orderreferentie
shipping.namestringJaVolledige naam eindklant
shipping.address1stringJaStraat en huisnummer
shipping.address2stringNeeExtra adresregel
shipping.citystringJaPlaats
shipping.zipstringJaPostcode
shipping.countrystringJaISO 3166-1 alpha-2 (NL, BE, DE, FR)
shipping.phonestringNeeTelefoon eindklant
shipping.emailstringNeeE-mail eindklant
items[].eanstringJaProduct EAN-code
items[].skustringNeeProduct SKU (fallback als EAN ontbreekt)
items[].quantityintegerJaTe bestellen hoeveelheid
// 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 }
  ]
}

Response 200 OK

{
  "order_id": "TORM-500123",
  "status": "confirmed",
  "wallet_balance_after": 425.50,
  "currency": "EUR",
  "estimated_ship_date": "2026-07-17"
}

Response 402 Payment Required

Bij onvoldoende saldo wordt de order geweigerd (HTTP 402). Er wordt geen order aangemaakt en geen geld afgeschreven.
{
  "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"
}

Response 409 Conflict

{
  "error": "insufficient_stock",
  "message": "Item 8711234567890 has insufficient stock.",
  "item_ean": "8711234567890",
  "requested": 2,
  "available": 1
}
Idempotentie: Voeg een Idempotency-Key header toe om dubbele orders bij retries te voorkomen. Zelfde key = geen dubbele order aangemaakt.
↑ Terug naar boven

Voorraad synchroniseren

Controleer real-time beschikbaarheid van artikelen voordat u ze aanbiedt in uw winkel. Beschikbaar als single of batch request.

Enkel artikel

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

Batch (max 100 per verzoek)

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

// Response
{
  "items": [
    { "ean": "8711234567890", "available": true, "quantity": 47 },
    { "ean": "8711234567891", "available": false, "quantity": 0 }
  ]
}
↑ Terug naar boven

Wallet beheren

Raadpleeg uw huidige saldo en transactiegeschiedenis, of laad uw wallet op via iDeal.

Powered by Shopwaive — Wallet endpoints gebruiken de Shopwaive REST API met aparte authenticatie.

Saldo & transacties

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"
    }
  ]
}
Parameters: ?activity=true voor transactiegeschiedenis, ?orders=true voor gekoppelde Shopify orders.

Opwaarderen

Minimale opwaardering is EUR 100. Saldo vervalt niet.
GET /products/wallet-opwaarderen
Opwaarderen verloopt via de normale Shopify checkout. Koop het wallet opwaardeer-product aan, kies het bedrag en betaal met iDeal. Na betaling wordt het saldo automatisch bijgewerkt via Shopwaive + Shopify Flow.
// 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 }
↑ Terug naar boven

Orderoverzicht

Bekijk uw recente orders met fulfillment-status en 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-parameters: status (confirmed, shipped, cancelled), limit (max 50), offset voor paginering.
↑ Terug naar boven

Webhooks

Wij sturen notificaties naar uw ingestelde webhook-URL bij order-status wijzigingen. Alle webhooks zijn ondertekend met HMAC-SHA256.

EventTriggerPayload
order.confirmedOrder aangemaakt + wallet afgeboektorder_id, amount, wallet_balance_after
order.shippedFulfillment aangemaakt in Shopifyorder_id, tracking_number, tracking_carrier
order.cancelledOrder geannuleerdorder_id, reason, refund_amount
wallet.low_balanceSaldo daalt onder drempelbalance, threshold, top_up_url

Webhook verificatie

// 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()
↑ Terug naar boven

Foutafhandeling

De API gebruikt standaard HTTP-statuscodes. Foutresponses bevatten een machineleesbare error-code en een beschrijving.

CodeErrorBeschrijving
401unauthorizedOntbrekende of ongeldige API-sleutel
402insufficient_wallet_balanceWallet-saldo te laag voor order
404product_not_foundEAN/SKU niet gevonden in catalogus
409insufficient_stockAangevraagde hoeveelheid overschrijdt beschikbare voorraad
422validation_errorOntbrekende of ongeldige verzoekvelden
429rate_limit_exceededTe veel verzoeken (max 100/min)
500internal_errorServerfout - retry met backoff
↑ Terug naar boven

Code voorbeelden

Kant-en-klare voorbeelden voor het doorzetten van een order in de meest gebruikte talen.

$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');
}
↑ Terug naar boven

Rate limits & best practices

Maximum 100 requests per minuut per API-sleutel. Gebruik batch-endpoints voor voorraadchecks om requests te besparen.

LimietWaarde
Verzoeken per minuut100 per API-sleutel
Verzoeken per uur1000 per API-sleutel
Batch voorraadcheckMax 100 EAN's per verzoek
Orders per verzoek1 (een order per API-call)
Rate limit headersX-RateLimit-Remaining, X-RateLimit-Reset
Best practice: Synchroniseer voorraad via batch-endpoint elke 15-30 minuten. Gebruik webhooks voor orderstatus-updates in plaats van polling. Voeg altijd Idempotency-Key toe aan order-verzoeken om veilig te retryen bij netwerkfouten.