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.
Inhoudsopgave
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
https://api.tormino.com/dropship/v1Wallet API:
https://app.shopwaive.com/api
Orders doorzetten
Plaats een nieuwe order vanuit uw systeem rechtstreeks in ons magazijn. De order wordt alleen aangemaakt bij voldoende wallet-saldo en voorraad.
Request
| Parameter | Type | Verplicht | Beschrijving |
|---|---|---|---|
| reference | string | Ja | Uw interne orderreferentie |
| shipping.name | string | Ja | Volledige naam eindklant |
| shipping.address1 | string | Ja | Straat en huisnummer |
| shipping.address2 | string | Nee | Extra adresregel |
| shipping.city | string | Ja | Plaats |
| shipping.zip | string | Ja | Postcode |
| shipping.country | string | Ja | ISO 3166-1 alpha-2 (NL, BE, DE, FR) |
| shipping.phone | string | Nee | Telefoon eindklant |
| shipping.email | string | Nee | E-mail eindklant |
| items[].ean | string | Ja | Product EAN-code |
| items[].sku | string | Nee | Product SKU (fallback als EAN ontbreekt) |
| items[].quantity | integer | Ja | Te 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
{
"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
}
Idempotency-Key header toe om dubbele orders bij retries te voorkomen. Zelfde key = geen dubbele order aangemaakt.Voorraad synchroniseren
Controleer real-time beschikbaarheid van artikelen voordat u ze aanbiedt in uw winkel. Beschikbaar als single of batch request.
Enkel artikel
{
"ean": "8711234567890",
"sku": "TORM-12345",
"available": true,
"quantity": 47,
"lead_time_days": 1
}
Batch (max 100 per verzoek)
// Request { "eans": ["8711234567890", "8711234567891"] } // Response { "items": [ { "ean": "8711234567890", "available": true, "quantity": 47 }, { "ean": "8711234567891", "available": false, "quantity": 0 } ] }
Wallet beheren
Raadpleeg uw huidige saldo en transactiegeschiedenis, of laad uw wallet op via iDeal.
Saldo & transacties
# 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 voor transactiegeschiedenis, ?orders=true voor gekoppelde Shopify orders.
Opwaarderen
// 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 }
Orderoverzicht
Bekijk uw recente orders met fulfillment-status en 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 voor paginering.Webhooks
Wij sturen notificaties naar uw ingestelde webhook-URL bij order-status wijzigingen. Alle webhooks zijn ondertekend met HMAC-SHA256.
| Event | Trigger | Payload |
|---|---|---|
| order.confirmed | Order aangemaakt + wallet afgeboekt | order_id, amount, wallet_balance_after |
| order.shipped | Fulfillment aangemaakt in Shopify | order_id, tracking_number, tracking_carrier |
| order.cancelled | Order geannuleerd | order_id, reason, refund_amount |
| wallet.low_balance | Saldo daalt onder drempel | balance, 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()
Foutafhandeling
De API gebruikt standaard HTTP-statuscodes. Foutresponses bevatten een machineleesbare error-code en een beschrijving.
| Code | Error | Beschrijving |
|---|---|---|
| 401 | unauthorized | Ontbrekende of ongeldige API-sleutel |
| 402 | insufficient_wallet_balance | Wallet-saldo te laag voor order |
| 404 | product_not_found | EAN/SKU niet gevonden in catalogus |
| 409 | insufficient_stock | Aangevraagde hoeveelheid overschrijdt beschikbare voorraad |
| 422 | validation_error | Ontbrekende of ongeldige verzoekvelden |
| 429 | rate_limit_exceeded | Te veel verzoeken (max 100/min) |
| 500 | internal_error | Serverfout - retry met backoff |
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'); }
Rate limits & best practices
Maximum 100 requests per minuut per API-sleutel. Gebruik batch-endpoints voor voorraadchecks om requests te besparen.
| Limiet | Waarde |
|---|---|
| Verzoeken per minuut | 100 per API-sleutel |
| Verzoeken per uur | 1000 per API-sleutel |
| Batch voorraadcheck | Max 100 EAN's per verzoek |
| Orders per verzoek | 1 (een order per API-call) |
| Rate limit headers | X-RateLimit-Remaining, X-RateLimit-Reset |
Idempotency-Key toe aan order-verzoeken om veilig te retryen bij netwerkfouten.