Bu doküman, önceki Turor OMS paketinin (POST /restApi/v1/dropShippingOrder, GET /restApi/v1/dropShippingOrderItem/{id}) yerine geçer. O uçlar ve HTTP Basic kullanıcı bilgileri kullanımdan kaldırılmıştır, artık kullanılmamalıdır. Alan bazında karşılaştırma için bu sayfanın sonundaki Ek A'ya bakın.
Bu API'ye ihtiyacınız var mı?
Çoğu partnerin ihtiyacı yok. WooCommerce veya Shopify kullanıyorsanız eklentimizi kullanın — WooCommerce veya Shopify. Bu API'yi yalnızca kendi sisteminiz varsa kullanın.
Kataloğu aktarmak, stok ve fiyatları güncel tutmak ve marj ayrı bir sayfada: Katalog feed'i.
Geliştiricileriniz için bu sayfanın PDF sürümü: Partner Sipariş API'si v1.0 (PDF).
1. Ortamlar
| Ortam | Temel URL |
|---|---|
| Canlı (production) | https://cosmeticwholesale.eu/api/v1 |
| Test (staging) | https://cosmeticwholesale1.bookgurusapi.com/api/v1 |
Bu dokümandaki tüm örnekler canlı ortam URL'ini kullanır. Token'lar ortamlar arasında paylaşılmaz — önce test etmek isterseniz hesap yöneticinizden bir staging token'ı isteyin.
2. Kimlik doğrulama
Her istek hesap token'ınızı bearer token olarak taşır:
Authorization: Bearer HESAP_TOKENINIZ
Bu, ürün katalog feed'i (GET /api/v1/feeds/catalog.csv) için kullandığınız token'ın aynısıdır. Cosmetic Wholesale hesabınızın Account sayfasında, feed URL'inizle birlikte bulabilirsiniz.
Notlar:
- Token hesabınızı temsil eder. Tarayıcı tarafı kodda veya herkese açık bir depoda asla yayımlamayın.
- Token'lar hesabınızdan istediğiniz zaman iptal edilip yenilenebilir. İptal edilmiş token
401döner. - Kullanıcı adı/şifre kullanılmaz. Eski HTTP Basic bilgileri sipariş gönderimi için artık geçerli değildir.
- Alternatif olarak
X-Feed-Token: HESAP_TOKENINIZbaşlığı da kabul edilir.
3. Ön koşullar
Bir sipariş yalnızca aşağıdakilerin tamamı sağlandığında kabul edilir:
- Hesabınız onaylı ve dropshipping kanalında olmalı.
- Dropshipping aboneliğiniz aktif olmalı — aksi halde her istek
403 subscription_requireddöner. - Cüzdan bakiyeniz siparişi karşılamalı — karşılamıyorsa sipariş oluşturulur ve beklemeye alınır (
402, bkz. bölüm 6). - Siparişteki her
eankatalog feed'inizde bulunmalı ve stokta olmalı.
Ürün başlığı, görseli ve fiyatı sizin tarafınızdan gönderilmez — bunlar bizim kataloğumuzdan gelir. Siz yalnızca EAN ve adet gönderirsiniz.
4. Sipariş oluşturma
POST /dropshipping/orders
İstek başlıkları
Authorization: Bearer HESAP_TOKENINIZ
Content-Type: application/json
İstek gövdesi
{
"externalRef": "ORD123456",
"payment": "WALLET",
"shipping": {
"firstName": "Ad",
"lastName": "Soyad",
"company": "TestFirma",
"address1": "Main Street 123",
"address2": "",
"postcode": "1072 HM",
"city": "Amsterdam",
"country": "NL",
"phone": "",
"email": "musteri@ornek.com"
},
"lines": [
{ "ean": "6291107455365", "quantity": 2 },
{ "ean": "3607348816552", "quantity": 3 }
]
}
Alanlar
| Alan | Tip | Zorunlu | Açıklama |
|---|---|---|---|
externalRef | string | evet | Kendi sipariş numaranız. Hesabınız içinde benzersiz olmalı. Idempotency anahtarıdır — bkz. bölüm 5. |
payment | string | hayır | Yalnızca "WALLET" destekleniyor. Varsayılan "WALLET". |
lines[].ean | string | evet | Katalog feed'inizde yayımlanan EAN. |
lines[].quantity | integer | evet | En az 1 olmalı. |
shipping.firstName | string | tavsiye edilir | |
shipping.lastName | string | tavsiye edilir | |
shipping.address1 | string | evet | |
shipping.address2 | string | hayır | |
shipping.postcode | string | evet | |
shipping.city | string | evet | |
shipping.country | string | evet | ISO 3166-1 alpha-2, örn. NL, BE, DE. Kargo yaptığımız bir ülke olmalı. |
shipping.company | string | hayır | |
shipping.state | string | hayır | |
shipping.phone | string | hayır | Tavsiye edilir — bazı kargo firmaları zorunlu tutuyor. |
shipping.email | string | hayır | Destekleyen taşıyıcılarda bildirim için kullanılır. |
Geriye dönük uyumluluk için snake_case karşılıkları da kabul edilir: external_ref, first_name, last_name, address_1, address_2 ve quantity yerine qty.
Yanıt
{
"id": "8f1c0b2e-6a3d-4f21-9b7e-0c5a4d2e1f33",
"externalRef": "ORD123456",
"omsReference": "ds:usr_2f9a1c:ORD123456",
"createdVia": "dropshipping-api",
"status": "PAID",
"walletDebited": true,
"omsPushStatus": "pending",
"omsOrderItemIds": [],
"tracking": []
}
| Alan | Anlamı |
|---|---|
id | Cosmetic Wholesale sipariş kimliği (UUID). Bunu saklayın. |
externalRef | Gönderdiğiniz sipariş numarasının yankısı. |
omsReference | Depo referansı, ds:{hesapId}:{externalRef} biçiminde. |
status | Bkz. bölüm 7. |
walletDebited | Sipariş cüzdandan tahsil edildiğinde true olur. |
omsPushStatus | Depoya aktarımın durumu: pending, pushed, retry, failed, skipped veya null. |
omsOrderItemIds | Depo satır kimlikleri; aktarım tamamlandıktan sonra dolar. İlk yanıtta boştur — GET ile sorgulayın. |
tracking | Kargo çıkana kadar boştur. Bkz. bölüm 8. |
HTTP durum kodları
| Kod | Anlamı | Sisteminiz ne yapmalı |
|---|---|---|
201 | Sipariş oluşturuldu ve cüzdandan ödendi. | Gönderildi olarak işaretleyin. |
200 | Bu externalRef zaten var. Gövde, o siparişin güncel durumudur. | Hiçbir şey — bu güvenli bir tekrar denemedir. |
402 | Sipariş oluşturuldu ama beklemede: cüzdan bakiyesi yetersiz. | İptal etmeyin. Bkz. bölüm 6. |
400 | Doğrulama hatası. | Gövdeyi düzeltin; aynısını tekrar göndermeyin. |
401 | Token eksik, geçersiz veya iptal edilmiş. | Bilgileri kontrol edin. |
403 | Aktif dropshipping aboneliği yok. | Bizimle iletişime geçin. |
404 | (Yalnızca GET) Sipariş hesabınızda bulunamadı. | |
409 | Bir veya daha fazla satır için stok yetersiz. | Sonra tekrar deneyin veya adedi düşürün. |
5. Idempotency (tekrar gönderim güvenliği)
externalRef idempotency anahtarıdır. Aynı externalRef ile iki kez gönderim yapmak asla ikinci bir sipariş oluşturmaz ve cüzdanınızdan iki kez tahsilat yapmaz:
- İlk deneme başarılıysa, ikincisi mevcut siparişle birlikte
200döner. - İlk deneme bakiye yetersizliğinden beklemeye alındıysa, ikinci deneme cüzdan ödemesini yeniden dener ve bakiye yeterli olduğunda
201/200döner.
Bu sayede zaman aşımı ve ağ hatalarında tekrar denemek güvenlidir. Her zaman aynı externalRef ile tekrar deneyin — aynı müşteri siparişi için asla yeni bir referans üretmeyin.
6. Bakiye yetersizliği: 402 HOLD sözleşmesi
Bu davranışın eski OMS API'sinde karşılığı yoktu ve en sık yapılan entegrasyon hatasıdır.
Cüzdanınız siparişi karşılamadığında:
HTTP/1.1 402 Payment Required
{
"id": "8f1c0b2e-6a3d-4f21-9b7e-0c5a4d2e1f33",
"externalRef": "ORD123456",
"status": "HOLD",
"reason": "INSUFFICIENT_WALLET",
"walletDebited": false,
"omsPushStatus": null,
"omsOrderItemIds": [],
"tracking": []
}
Bunun anlamı:
- Sipariş sistemimizde vardır ve stoğu rezerve edilmiştir. Reddedilmemiş, silinmemiştir.
- Hiçbir tahsilat yapılmamıştır.
- Depoya henüz hiçbir şey gönderilmemiştir.
Sisteminizin yapması gerekenler:
- Siparişi kendi tarafınızda iptal etmeyin veya silmeyin. Bekliyor/hazırlanıyor durumunda tutun.
- Cüzdanınıza bakiye yükleyin.
- Aynı
externalRefile yeniden POST edin; ya da bekleyin: beklemedeki siparişler bakiye yeterli hale geldiğinde otomatik olarak yeniden denenir. walletDebitedtrueolana vestatusartıkHOLDolmayana kadarGETile sorgulayın.
402 üzerine iptal etmek mutabakatı bozan şeydir — sipariş bizde rezerve olarak dururken sizin sisteminiz onu başarısız sanır.
7. Sipariş sorgulama
GET /dropshipping/orders/{id}
GET /dropshipping/orders?externalRef=ORD123456
{id} yerine hem Cosmetic Wholesale id'si (UUID) hem de kendi externalRef'iniz kullanılabilir. Her iki biçim de sipariş oluşturma ile aynı gövdeyi döner. Siparişler token'ınıza bağlıdır — yalnızca kendi siparişlerinizi okuyabilirsiniz.
GET https://cosmeticwholesale.eu/api/v1/dropshipping/orders?externalRef=ORD123456
Authorization: Bearer HESAP_TOKENINIZ
Sipariş durumları
status | Anlamı |
|---|---|
HOLD | Cüzdan bakiyesi yetersiz olduğu için beklemede (bkz. bölüm 6). |
PENDING_PAYMENT | Cüzdan ödemesi sürüyor. |
ON_HOLD | Kargo/KDV işlemesi bekleniyor. |
PAID | Cüzdandan ödendi. |
PROCESSING | Depoda hazırlanıyor. |
SHIPPED | Kargoya teslim edildi — tracking dolu. |
COMPLETED | Teslim edildi / kapandı. |
CANCELLED, REFUNDED | Nihai durumlar. |
8. Kargo takibi
Takip bilgisi aynı GET içinde, dizi olarak döner (bir sipariş birden fazla kolide çıkabilir):
{
"id": "8f1c0b2e-6a3d-4f21-9b7e-0c5a4d2e1f33",
"externalRef": "ORD123456",
"status": "SHIPPED",
"walletDebited": true,
"omsPushStatus": "pushed",
"omsOrderItemIds": ["418224", "418225", "418226"],
"tracking": [
{
"provider": "postnl-3s",
"trackingNumber": "3SXXXX00000000",
"dateShipped": "2026-05-06T17:39:20.000Z"
}
]
}
Sipariş başına saatte birden fazla sorgu yapmayın. COMPLETED, CANCELLED veya REFUNDED durumundaki siparişleri sorgulamayın.
9. Hata kodları
Hatalar { "error": "<mesaj>", "code": "<kod>" } biçiminde döner.
code | HTTP | Sebep |
|---|---|---|
external_ref_required | 400 | externalRef eksik veya boş. |
lines_required | 400 | lines eksik veya boş. |
ean_required | 400 | Bir satırda ean yok. |
invalid_qty | 400 | quantity pozitif tam sayı değil. |
unknown_ean | 400 | EAN kataloğunuzda yok. |
forbidden_ean | 400 | Bu EAN bu uç üzerinden sipariş edilemez. |
shipping_required | 400 | shipping nesnesi eksik. |
shipping_incomplete | 400 | address1, city, postcode veya country eksik. |
shipping_country_required | 400 | Ülke boş veya kargo bölgelerimizde değil. |
payment_wallet_only | 400 | payment alanı WALLET dışında bir değer içeriyor. |
invalid_json | 400 | Gövde geçerli JSON değil. |
| — | 401 | Token eksik, geçersiz veya iptal edilmiş. |
subscription_required | 403 | Aktif dropshipping aboneliği yok. |
not_found | 404 | Hesabınızda böyle bir sipariş yok. |
insufficient_stock | 409 | Bir veya daha fazla satır için stok yetersiz. |
10. Örnekler
cURL — sipariş oluşturma
curl -X POST https://cosmeticwholesale.eu/api/v1/dropshipping/orders \
-H "Authorization: Bearer HESAP_TOKENINIZ" \
-H "Content-Type: application/json" \
-d '{
"externalRef": "ORD123456",
"shipping": {
"firstName": "Ad",
"lastName": "Soyad",
"address1": "Main Street 123",
"postcode": "1072 HM",
"city": "Amsterdam",
"country": "NL"
},
"lines": [
{ "ean": "6291107455365", "quantity": 2 }
]
}'
cURL — sipariş sorgulama
curl "https://cosmeticwholesale.eu/api/v1/dropshipping/orders?externalRef=ORD123456" \
-H "Authorization: Bearer HESAP_TOKENINIZ"
PHP — sipariş oluşturma
<?php
$token = 'HESAP_TOKENINIZ';
$url = 'https://cosmeticwholesale.eu/api/v1/dropshipping/orders';
$payload = [
'externalRef' => 'ORD123456',
'shipping' => [
'firstName' => 'Ad',
'lastName' => 'Soyad',
'address1' => 'Main Street 123',
'postcode' => '1072 HM',
'city' => 'Amsterdam',
'country' => 'NL',
],
'lines' => [
['ean' => '6291107455365', 'quantity' => 2],
],
];
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . $token,
'Content-Type: application/json',
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$order = json_decode($response, true);
if ($status === 402) {
// Cüzdan bakiyesi yetersiz, sipariş beklemede.
// Siparişi açık tutun ve bakiye yükledikten sonra AYNI externalRef ile tekrar gönderin.
} elseif ($status === 201 || $status === 200) {
// Kabul edildi. $order['id'] değerini saklayın ve takip için sorgulayın.
}
?>
PHP — sipariş sorgulama
<?php
$token = 'HESAP_TOKENINIZ';
$externalRef = 'ORD123456';
$url = 'https://cosmeticwholesale.eu/api/v1/dropshipping/orders/' . rawurlencode($externalRef);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Authorization: Bearer ' . $token]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>
Ek A — Turor OMS uçlarından geçiş
Eski paket https://omsback.turor.org/restApi/v1 adresini ve HTTP Basic kimlik bilgilerini kullanıyordu. Bu bilgiler paylaşılan bir sistem hesabına aitti ve cüzdan, stok ve abonelik katmanını atlıyordu. Artık verilmiyor, mevcut olanlar da geri çekilecek.
Uçlar
| Eski | Yeni |
|---|---|
POST /restApi/v1/dropShippingOrder | POST /api/v1/dropshipping/orders |
GET /restApi/v1/dropShippingOrderItem/{id} | GET /api/v1/dropshipping/orders/{id} (satır değil, sipariş seviyesinde) |
HTTP Basic username / password | Authorization: Bearer <hesap token'ı> |
İstek alanları
| Eski | Yeni |
|---|---|
order_number | externalRef |
line_items[] | lines[] |
line_items[].ean | lines[].ean |
line_items[].quantity | lines[].quantity |
line_items[].name | kaldırıldı — kataloğumuzdan alınır |
line_items[].image_src | kaldırıldı — kataloğumuzdan alınır |
shipping.first_name / last_name | shipping.firstName / lastName (snake_case hâlâ kabul edilir) |
shipping.address_1 / address_2 | shipping.address1 / address2 (snake_case hâlâ kabul edilir) |
shipping.country, city, postcode, company, phone | değişmedi |
| — | payment: "WALLET" |
Yanıt alanları
| Eski | Yeni |
|---|---|
orderCreated: 1 | HTTP 201 |
orderCreated: 0 (zaten var) | HTTP 200 |
productCreated / productUpdated / orderUpdated | kaldırıldı |
omsOrderItemIds: "8059,8060" (virgüllü metin) | omsOrderItemIds: ["8059","8060"] (metin dizisi) |
Gövdedeki statusCode / message | HTTP durum kodu; hatalar error + code taşır |
data.status, data.trackingNumber, data.trackingDate | status, tracking[].trackingNumber, tracking[].dateShipped |
data.serializedData, shippingProviderName | tracking[].provider |
| — | walletDebited, omsPushStatus, 402 HOLD |
Kodunuzda gözden geçirmeniz gereken davranış değişiklikleri
402bir hata değildir. Eski API'de cüzdan katmanı yoktu.402'yi "beklemede, aynı referansla tekrar dene" olarak ele alın — asla "siparişi iptal et" olarak değil.- Tekrar denemek güvenlidir.
externalRefmükerrer kaydı engeller; eskiorderCreated: 0kontrolünün yerini200ile201ayrımı alır. - Takip sipariş seviyesine taşındı. Satır başına bir
GETyerine sipariş başına tekGET, ve sonuç bir dizidir. - Ürün verisi bize aittir. Başlık ve görsel URL'i göndermeyi bırakın.