توثيق API التوصيل

الدليل الشامل لربط أنظمة التوصيل مع منصة Essalmy Store

الإصدار 1.0.0

📖 المقدمة

مرحبًا بك في توثيق API التوصيل لمنصة Essalmy Store. يتيح لك هذا الـ API إدارة طلبات التوصيل بشكل فعال وتكامل سلس مع أنظمة التوصيل الخاصة بشركتك.

يستخدم هذا الـ API بروتوكول REST مع صيغة البيانات JSON لجميع الطلبات والاستجابات، مما يوفر بيئة تطوير موحدة وسهلة الاستخدام.

المتطلبات الأساسية

  • مفتاح API (API Key): يمكنك الحصول عليه من إدارة المنصة
  • اتصال بالإنترنت: لجميع الطلبات والاستجابات
  • دعم JSON: لمعالجة البيانات المرسلة والمُستلمة
  • بروتوكول HTTP/HTTPS: لتنفيذ الطلبات
ℹ️
ملاحظة: يُنصح باستخدام HTTPS في بيئة الإنتاج لضمان أمان البيانات المنقولة.

🔐 المصادقة

جميع الطلبات إلى الـ API يجب أن تتضمن مفتاح المصادقة (API Key) في رأس الطلب (Header). يتم تمرير المفتاح عبر رأس X-API-Key.

⚠️
تنبيه أمني: لا تشارك مفتاح API الخاص بك مع أي شخص. يجب تخزينه بشكل آمن وعدم نشره في كود مصدري علني أو مستودعات GitHub.

مثال على إرسال المفتاح

cURL
curl -X GET "https://essalmy.com/api/delivery.php?action=orders&filter=available" \
     -H "X-API-Key: YOUR_API_KEY_HERE" \
     -H "Content-Type: application/json"
PHP
<?php

$apiKey = 'YOUR_API_KEY_HERE';
$url = 'https://essalmy.com/api/delivery.php?action=orders&filter=available';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'X-API-Key: ' . $apiKey,
    'Content-Type: application/json'
]);

$response = curl_exec($ch);
$data = json_decode($response, true);

curl_close($ch);
print_r($data);
Python
import requests

api_key = 'YOUR_API_KEY_HERE'
url = 'https://essalmy.com/api/delivery.php'

headers = {
    'X-API-Key': api_key,
    'Content-Type': 'application/json'
}

params = {
    'action': 'orders',
    'filter': 'available'
}

response = requests.get(url, headers=headers, params=params)
data = response.json()
print(data)
JavaScript
const apiKey = 'YOUR_API_KEY_HERE';
const url = 'https://essalmy.com/api/delivery.php';

const params = new URLSearchParams({
    action: 'orders',
    filter: 'available'
});

const response = await fetch(`${url}?${params}`, {
    method: 'GET',
    headers: {
        'X-API-Key': apiKey,
        'Content-Type': 'application/json'
    }
});

const data = await response.json();
console.log(data);
Flutter/Dart
final response = await http.get(
  Uri.parse('https://essalmy.com/api/delivery.php?action=orders'),
  headers: {
    'X-API-Key': 'YOUR_API_KEY_HERE',
    'Content-Type': 'application/json',
  },
);
final data = json.decode(response.body);
print(data);
Java
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://essalmy.com/api/delivery.php?action=orders"))
    .header("X-API-Key", "YOUR_API_KEY_HERE")
    .header("Content-Type", "application/json")
    .GET()
    .build();

HttpResponse<String> response = client.send(
    request, HttpResponse.BodyHandlers.ofString()
);
System.out.println(response.body());
C# (.NET)
client.DefaultRequestHeaders.Add("X-API-Key", "YOUR_API_KEY_HERE");

var response = await client.GetAsync(
    "https://essalmy.com/api/delivery.php?action=orders"
);
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);
Ruby
uri = URI('https://essalmy.com/api/delivery.php?action=orders')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true

request = Net::HTTP::Get.new(uri)
request['X-API-Key'] = 'YOUR_API_KEY_HERE'

response = http.request(request)
puts JSON.parse(response.body)
Go
req, _ := http.NewRequest("GET",
    "https://essalmy.com/api/delivery.php?action=orders", nil)
req.Header.Set("X-API-Key", "YOUR_API_KEY_HERE")

client := &http.Client{}
resp, _ := client.Do(req)
defer resp.Body.Close()

body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))
Swift (iOS)
var request = URLRequest(url: URL(string: "https://essalmy.com/api/delivery.php?action=orders")!)
request.httpMethod = "GET"
request.setValue("YOUR_API_KEY_HERE", forHTTPHeaderField: "X-API-Key")

URLSession.shared.dataTask(with: request) { data, response, error in
    guard let data = data else { return }
    if let json = try? JSONSerialization.jsonObject(with: data) {
        print(json)
    }
}.resume()

🔗 الرابط الأساسي

جميع الطلبات إلى الـ API يتم إرسالها إلى الرابط الأساسي التالي. تأكد من استخدام هذا الرابط في جميع استدعاءاتك:

GET/POST → https://essalmy.com/api/delivery.php
ℹ️
ملاحظة: يتم تمرير جميع المعاملات (Parameters) عبر رابط الاستعلام (Query String) في كلا методي GET و POST.

📡 الـ Endpoints المتاحة

جدول شامل بجميع نقاط النهاية (Endpoints) المتاحة في الـ API:

العملية الطريقة الرابط الوصف
الطلبات المتاحة GET ?action=orders&filter=available الطلبات غير المكلفة
طلباتي GET ?action=orders&filter=assigned الطلبات المكلفة بشركتك
تم التوصيل GET ?action=orders&filter=delivered الطلبات المُسلّمة
جميع الطلبات GET ?action=orders&filter=all جميع طلبات الشركة
تفاصيل طلب GET ?action=order&id={id} تفاصيل طلب معين
تكليف الطلب POST ?action=assign تكليف طلب بالشركة
تحديث الحالة POST ?action=update_status تحديث حالة التوصيل
تسليم الطلب POST ?action=deliver تسليم الطلب مع إثبات
تتبع الطلب GET ?action=track&id={id} سجل تتبع الطلب
الإحصائيات GET ?action=stats إحصائيات الشركة

📦 جلب الطلبات

GET ?action=orders&filter={filter}

جلب قائمة الطلبات حسب الفلتر المحدد. يمكنك استخدام الفلاتر التالية:

  • filter مطلوب نوع الفلتر: available | assigned | delivered | all
  • page اختياري رقم الصفحة (الافتراضي: 1)

مثال على الاستجابة

JSON
{
    "success": true,
    "data": {
        "orders": [
            {
                "id": 1234,
                "order_number": "ORD-2026-001",
                "customer_name": "أحمد محمد",
                "customer_phone": "0501234567",
                "delivery_address": "الرياض، حي النزهة، شارع الأمير سلطان",
                "city": "الرياض",
                "status": "pending",
                "total_amount": 250.00,
                "delivery_fee": 15.00,
                "created_at": "2026-06-24 10:30:00",
                "notes": "يرجى التوصيل قبل العصر"
            }
        ],
        "pagination": {
            "current_page": 1,
            "total_pages": 5,
            "total_orders": 47,
            "per_page": 10
        }
    }
}

📋 تفاصيل الطلب

GET ?action=order&id={id}

جلب تفاصيل طلب معين مع جميع المنتجات وسجل التاريخ.

  • id مطلوب رقم الطلب (ID)

مثال على الاستجابة

JSON
{
    "success": true,
    "data": {
        "id": 1234,
        "order_number": "ORD-2026-001",
        "customer_name": "أحمد محمد",
        "customer_phone": "0501234567",
        "delivery_address": "الرياض، حي النزهة، شارع الأمير سلطان",
        "city": "الرياض",
        "status": "picked_up",
        "total_amount": 250.00,
        "delivery_fee": 15.00,
        "items": [
            {
                "name": "سماعة بلوتوث لاسلكية",
                "quantity": 1,
                "price": 150.00
            },
            {
                "name": "شاحن متنقل 10000mAh",
                "quantity": 2,
                "price": 50.00
            }
        ],
        "history": [
            {
                "status": "pending",
                "timestamp": "2026-06-24 10:30:00",
                "notes": "تم إنشاء الطلب"
            },
            {
                "status": "picked_up",
                "timestamp": "2026-06-24 11:15:00",
                "notes": "تم استلام الطلب من المستودع",
                "location": "مستودع الرياض المركزي"
            }
        ],
        "created_at": "2026-06-24 10:30:00",
        "assigned_at": "2026-06-24 11:00:00"
    }
}

🏷️ تكليف الطلب

POST ?action=assign

تكليف طلب معين بشركتك للبدء في عملية التوصيل. لا يمكن تكليف طلب مكلف بشركة أخرى.

  • order_id مطلوب رقم الطلب المراد تكليفه

مثال على الاستجابة

JSON
{
    "success": true,
    "message": "تم تكليف الطلب بنجاح",
    "data": {
        "order_id": 1234,
        "status": "assigned",
        "assigned_at": "2026-06-24 11:00:00"
    }
}
🚫
خطأ شائع: إذا حاولت تكليف طلب مكلف بشركة أخرى، ستحصل على خطأ: "الطلب مكلف بشركة أخرى بالفعل"

🔄 تحديث الحالة

POST ?action=update_status

تحديث حالة التوصيل للطلب مع تحديد الموقع الحالي والملاحظات.

  • order_id مطلوب رقم الطلب
  • status مطلوب الحالة الجديدة: picked_up | in_transit | out_for_delivery | failed
  • location اختياري الموقع الحالي للسائق
  • notes اختياري ملاحظات إضافية

مثال على الاستجابة

JSON
{
    "success": true,
    "message": "تم تحديث الحالة بنجاح",
    "data": {
        "order_id": 1234,
        "old_status": "picked_up",
        "new_status": "in_transit",
        "updated_at": "2026-06-24 12:00:00"
    }
}

تسليم الطلب

POST ?action=deliver

تسليم الطلب مع إرفاق إثبات التسليم. يُستخدم هذا الـ Endpoint عند تسليم الطلب للعميل بالفعل.

  • order_id مطلوب رقم الطلب
  • notes اختياري ملاحظات التسليم
  • proof_image اختياري صورة إثبات التسليم (ملف - multipart/form-data)
📸
ملاحظة حول الصور: يجب إرسال طلب multipart/form-data عند إرفاق صورة إثبات التسليم. الحد الأقصى لحجم الصورة: 5 ميجابايت. الصيغ المدعومة: JPG, PNG, WEBP.

مثال على الاستجابة

JSON
{
    "success": true,
    "message": "تم تسليم الطلب بنجاح",
    "data": {
        "order_id": 1234,
        "status": "delivered",
        "delivered_at": "2026-06-24 14:30:00",
        "proof_image": "uploads/proofs/1234_proof.jpg"
    }
}

📍 تتبع الطلب

GET ?action=track&id={id}

عرض سجل تتبع كامل للطلب مع جميع التحديثات والمراحل التي مر بها.

  • id مطلوب رقم الطلب

مثال على الاستجابة

JSON
{
    "success": true,
    "data": {
        "order_id": 1234,
        "current_status": "in_transit",
        "history": [
            {
                "status": "pending",
                "status_ar": "قيد الانتظار",
                "timestamp": "2026-06-24 10:30:00",
                "notes": "تم إنشاء الطلب بنجاح",
                "location": null
            },
            {
                "status": "picked_up",
                "status_ar": "تم الاستلام",
                "timestamp": "2026-06-24 11:15:00",
                "notes": "تم استلام الطلب من المستودع",
                "location": "مستودع الرياض المركزي"
            },
            {
                "status": "in_transit",
                "status_ar": "في الطريق",
                "timestamp": "2026-06-24 12:00:00",
                "notes": "السائق في الطريق إلى العنوان",
                "location": "شارع الأمير سلطان، الرياض"
            }
        ]
    }
}

📊 الإحصائيات

GET ?action=stats

عرض إحصائيات شاملة لشركتك تشمل عدد الطلبات في كل مرحلة.

مثال على الاستجابة

JSON
{
    "success": true,
    "data": {
        "total": 156,
        "pending": 12,
        "picked_up": 8,
        "in_transit": 15,
        "out_for_delivery": 23,
        "delivered": 92,
        "failed": 4,
        "returned": 2,
        "today_delivered": 7,
        "today_revenue": 105.00
    }
}

🚦 حالات التوصيل

مسار التوصيل يمر بعدة مراحل متتالية. يجب تحديث الحالة بترتيب صحيح:

انتظار
pending
استلام
picked_up
طريق
in_transit
توصيل
out_for_delivery
تسليم
delivered

الحالات الإضافية

فشل التوصيل - failed مرتجع - returned

شرح الحالات

الحالة الاسم بالعربية الوصف
pending قيد الانتظار الطلب تم إنشاؤه ولم يتم تكليف شركة التوصيل بعد
picked_up تم الاستلام تم استلام الطلب من المستودع أو البائع
in_transit في الطريق السائق في طريقه إلى عنوان العميل
out_for_delivery خرج للتوصيل السائق وصل إلى المنطقة ويسعى للتسليم
delivered تم التوصيل تم تسليم الطلب للعميل بنجاح
failed فشل التوصيل لم يتم التوصيل بسبب خطأ أو رفض العميل
returned مرتجع تم إرجاع الطلب إلى البائع

📝 صيغة الاستجابة

استجابة ناجحة

JSON - Success
{
    "success": true,
    "data": {
        // البيانات المطلوبة هنا
    }
}

استجابة خطأ

JSON - Error
{
    "success": false,
    "message": "وصف الخطأ هنا",
    "error_code": "ERROR_CODE"
}

أكواد الحالة (Status Codes)

كود الحالة الوصف متى يظهر
200 نجاح تمت العملية بنجاح
400 طلب خاطئ معاملات مفقودة أو غير صحيحة
401 غير مصرح مفتاح API غير صحيح أو غير موجود
404 غير موجود الطلب أو الـ Endpoint غير موجود
500 خطأ داخلي خطأ في الخادم

أكواد الأخطاء

جميع أكواد الأخطاء التي قد تظهر أثناء استخدام الـ API:

كود الخطأ الرسالة الوصف
INVALID_API_KEY مفتاح API غير صحيح المفتاح المرسل غير موجود في قاعدة البيانات
MISSING_API_KEY مفتاح API مفقود لم يتم إرسال رأس X-API-Key
MISSING_ORDER_ID رقم الطلب مفقود معامل order_id مطلوب ومفقود
ORDER_NOT_FOUND الطلب غير موجود لا يوجد طلب بهذا الرقم
ORDER_ALREADY_ASSIGNED الطلب مكلف بالفعل الطلب مكلف بشركة أخرى
ORDER_NOT_ASSIGNED الطلب غير مكلف الطلب لم يتم تكليفه بشركتك
INVALID_STATUS حالة غير صحيحة الحالة المرسلة غير مدعومة
STATUS_TRANSITION_ERROR خطأ في تسلسل الحالات لا يمكن التحول من الحالة الحالية إلى الحالة الجديدة
MISSING_STATUS الحالة مفقودة معامل status مطلوب ومفقود
PROOF_IMAGE_REQUIRED صورة الإثبات مطلوبة يجب إرفاق صورة عند التسليم
INVALID_IMAGE_TYPE نوع صورة غير مدعوم الصورة يجب أن تكون JPG, PNG, أو WEBP
IMAGE_TOO_LARGE حجم الصورة كبير جداً الحد الأقصى لحجم الصورة 5 ميجابايت
RATE_LIMIT_EXCEEDED تجاوز حد الطلبات لقد تجاوزت الحد المسموح به من الطلبات في الدقيقة
SERVER_ERROR خطأ في الخادم حدث خطأ غير متوقع في الخادم

💻 أمثلة كود كاملة

أمثلة عملية وكاملة توضح كيفية استخدام جميع وظائف الـ API في سيناريو توصيل كامل:

PHP - مثال كامل
<?php

$apiKey = 'YOUR_API_KEY_HERE';
$baseUrl = 'https://essalmy.com/api/delivery.php';

function makeRequest($url, $apiKey, $method = 'GET', $data = null) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        'X-API-Key: ' . $apiKey,
        'Content-Type: application/json'
    ]);

    if ($method === 'POST') {
        curl_setopt($ch, CURLOPT_POST, true);
        if ($data) {
            curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
        }
    }

    $response = curl_exec($ch);
    curl_close($ch);

    return json_decode($response, true);
}

// 1. جلب الطلبات المتاحة
echo "=== جلب الطلبات المتاحة ===\n";
$url = $baseUrl . '?action=orders&filter=available';
$result = makeRequest($url, $apiKey);
print_r($result);

// 2. تكليف الطلب
echo "\n=== تكليف الطلب ===\n";
$url = $baseUrl . '?action=assign';
$result = makeRequest($url, $apiKey, 'POST', [
    'order_id' => 1234
]);
print_r($result);

// 3. تحديث الحالة إلى "في الطريق"
echo "\n=== تحديث الحالة ===\n";
$url = $baseUrl . '?action=update_status';
$result = makeRequest($url, $apiKey, 'POST', [
    'order_id' => 1234,
    'status' => 'in_transit',
    'location' => 'شارع الأمير سلطان، الرياض',
    'notes' => 'السائق في الطريق'
]);
print_r($result);

// 4. تسليم الطلب
echo "\n=== تسليم الطلب ===\n";
$url = $baseUrl . '?action=deliver';
$result = makeRequest($url, $apiKey, 'POST', [
    'order_id' => 1234,
    'notes' => 'تم التسليم للعميل'
]);
print_r($result);

?>
Python - مثال كامل
import requests

API_KEY = 'YOUR_API_KEY_HERE'
BASE_URL = 'https://essalmy.com/api/delivery.php'

headers = {
    'X-API-Key': API_KEY,
    'Content-Type': 'application/json'
}

# 1. جلب الطلبات المتاحة
print("=== جلب الطلبات المتاحة ===")
response = requests.get(
    BASE_URL,
    headers=headers,
    params={'action': 'orders', 'filter': 'available'}
)
print(response.json())

# 2. تكليف الطلب
print("\n=== تكليف الطلب ===")
response = requests.post(
    f"{BASE_URL}?action=assign",
    headers=headers,
    json={'order_id': 1234}
)
print(response.json())

# 3. تحديث الحالة إلى "في الطريق"
print("\n=== تحديث الحالة ===")
response = requests.post(
    f"{BASE_URL}?action=update_status",
    headers=headers,
    json={
        'order_id': 1234,
        'status': 'in_transit',
        'location': 'شارع الأمير سلطان، الرياض',
        'notes': 'السائق في الطريق'
    }
)
print(response.json())

# 4. تسليم الطلب
print("\n=== تسليم الطلب ===")
response = requests.post(
    f"{BASE_URL}?action=deliver",
    headers=headers,
    json={
        'order_id': 1234,
        'notes': 'تم التسليم للعميل'
    }
)
                            print(response.json())
Flutter/Dart - مثال كامل
import 'dart:convert';
import 'package:http/http.dart' as http;

class DeliveryApiService {
  final String apiKey = 'YOUR_API_KEY_HERE';
  final String baseUrl = 'https://essalmy.com/api/delivery.php';

  // جلب الطلبات المتاحة
  Future<Map<String, dynamic>> getAvailableOrders({int page = 1}) async {
    final response = await http.get(
      Uri.parse('$baseUrl?action=orders&filter=available&page=$page'),
      headers: {
        'X-API-Key': apiKey,
        'Content-Type': 'application/json',
      },
    );
    return json.decode(response.body);
  }

  // تكليف الطلب
  Future<Map<String, dynamic>> assignOrder(int orderId) async {
    final response = await http.post(
      Uri.parse('$baseUrl?action=assign'),
      headers: {
        'X-API-Key': apiKey,
        'Content-Type': 'application/x-www-form-urlencoded',
      },
      body: {'order_id': orderId.toString()},
    );
    return json.decode(response.body);
  }

  // تحديث الحالة
  Future<Map<String, dynamic>> updateStatus(
    int orderId, String status, {String? location, String? notes}
  ) async {
    final body = {
      'order_id': orderId.toString(),
      'status': status,
    };
    if (location != null) body['location'] = location;
    if (notes != null) body['notes'] = notes;

    final response = await http.post(
      Uri.parse('$baseUrl?action=update_status'),
      headers: {
        'X-API-Key': apiKey,
        'Content-Type': 'application/x-www-form-urlencoded',
      },
      body: body,
    );
    return json.decode(response.body);
  }

  // تسليم الطلب
  Future<Map<String, dynamic>> deliverOrder(int orderId, {String? notes}) async {
    final body = {'order_id': orderId.toString()};
    if (notes != null) body['notes'] = notes;

    final response = await http.post(
      Uri.parse('$baseUrl?action=deliver'),
      headers: {
        'X-API-Key': apiKey,
        'Content-Type': 'application/x-www-form-urlencoded',
      },
      body: body,
    );
    return json.decode(response.body);
  }

  // جلب الإحصائيات
  Future<Map<String, dynamic>> getStats() async {
    final response = await http.get(
      Uri.parse('$baseUrl?action=stats'),
      headers: {
        'X-API-Key': apiKey,
        'Content-Type': 'application/json',
      },
    );
    return json.decode(response.body);
  }
}

// مثال الاستخدام
void main() async {
  final api = DeliveryApiService();

  // جلب الطلبات
  final orders = await api.getAvailableOrders();
  print(orders);

  // تكليف طلب
  final assign = await api.assignOrder(1234);
  print(assign);
}
Java - مثال كامل
import java.net.http.*;
import java.net.URI;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;

public class DeliveryApiClient {
    private static final String API_KEY = "YOUR_API_KEY_HERE";
    private static final String BASE_URL = "https://essalmy.com/api/delivery.php";
    private static final HttpClient client = HttpClient.newBuilder().build();

    // جلب الطلبات المتاحة
    public static String getAvailableOrders() throws Exception {
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create(BASE_URL + "?action=orders&filter=available"))
            .header("X-API-Key", API_KEY)
            .header("Content-Type", "application/json")
            .GET()
            .build();

        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        return response.body();
    }

    // تكليف الطلب
    public static String assignOrder(int orderId) throws Exception {
        String body = "order_id=" + orderId;

        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create(BASE_URL + "?action=assign"))
            .header("X-API-Key", API_KEY)
            .header("Content-Type", "application/x-www-form-urlencoded")
            .POST(HttpRequest.BodyPublishers.ofString(body))
            .build();

        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        return response.body();
    }

    // تحديث الحالة
    public static String updateStatus(int orderId, String status, String location) throws Exception {
        String body = "order_id=" + orderId
            + "&status=" + URLEncoder.encode(status, StandardCharsets.UTF_8)
            + "&location=" + URLEncoder.encode(location, StandardCharsets.UTF_8);

        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create(BASE_URL + "?action=update_status"))
            .header("X-API-Key", API_KEY)
            .header("Content-Type", "application/x-www-form-urlencoded")
            .POST(HttpRequest.BodyPublishers.ofString(body))
            .build();

        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        return response.body();
    }

    // تسليم الطلب
    public static String deliverOrder(int orderId, String notes) throws Exception {
        String body = "order_id=" + orderId
            + "¬es=" + URLEncoder.encode(notes, StandardCharsets.UTF_8);

        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create(BASE_URL + "?action=deliver"))
            .header("X-API-Key", API_KEY)
            .header("Content-Type", "application/x-www-form-urlencoded")
            .POST(HttpRequest.BodyPublishers.ofString(body))
            .build();

        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        return response.body();
    }

    public static void main(String[] args) throws Exception {
        System.out.println(getAvailableOrders());
        System.out.println(assignOrder(1234));
    }
}
C# (.NET) - مثال كامل
using System;
using System.Net.Http;
using System.Text;
using System.Text.Json;

public class DeliveryApiClient
{
    private const string API_KEY = "YOUR_API_KEY_HERE";
    private const string BASE_URL = "https://essalmy.com/api/delivery.php";
    private static readonly HttpClient client = new HttpClient();

    // جلب الطلبات المتاحة
    public static async Task<string> GetAvailableOrdersAsync()
    {
        client.DefaultRequestHeaders.Remove("X-API-Key");
        client.DefaultRequestHeaders.Add("X-API-Key", API_KEY);

        var response = await client.GetAsync(
            $"{BASE_URL}?action=orders&filter=available"
        );
        return await response.Content.ReadAsStringAsync();
    }

    // تكليف الطلب
    public static async Task<string> AssignOrderAsync(int orderId)
    {
        client.DefaultRequestHeaders.Remove("X-API-Key");
        client.DefaultRequestHeaders.Add("X-API-Key", API_KEY);

        var body = new StringContent(
            $"order_id={orderId}",
            Encoding.UTF8,
            "application/x-www-form-urlencoded"
        );

        var response = await client.PostAsync(
            $"{BASE_URL}?action=assign", body
        );
        return await response.Content.ReadAsStringAsync();
    }

    // تحديث الحالة
    public static async Task<string> UpdateStatusAsync(
        int orderId, string status, string location
    )
    {
        client.DefaultRequestHeaders.Remove("X-API-Key");
        client.DefaultRequestHeaders.Add("X-API-Key", API_KEY);

        var body = new StringContent(
            $"order_id={orderId}&status={status}&location={Uri.EscapeDataString(location)}",
            Encoding.UTF8,
            "application/x-www-form-urlencoded"
        );

        var response = await client.PostAsync(
            $"{BASE_URL}?action=update_status", body
        );
        return await response.Content.ReadAsStringAsync();
    }

    // تسليم الطلب
    public static async Task<string> DeliverOrderAsync(int orderId, string notes)
    {
        client.DefaultRequestHeaders.Remove("X-API-Key");
        client.DefaultRequestHeaders.Add("X-API-Key", API_KEY);

        var body = new StringContent(
            $"order_id={orderId}¬es={Uri.EscapeDataString(notes)}",
            Encoding.UTF8,
            "application/x-www-form-urlencoded"
        );

        var response = await client.PostAsync(
            $"{BASE_URL}?action=deliver", body
        );
        return await response.Content.ReadAsStringAsync();
    }

    public static async Task Main()
    {
        Console.WriteLine(await GetAvailableOrdersAsync());
        Console.WriteLine(await AssignOrderAsync(1234));
    }
}
Ruby - مثال كامل
require 'net/http'
require 'json'
require 'uri'

API_KEY = 'YOUR_API_KEY_HERE'
BASE_URL = 'https://essalmy.com/api/delivery.php'

def make_request(action, method = 'GET', params = {})
  uri = URI("#{BASE_URL}?action=#{action}")
  uri.query = URI.encode_www_form(params) if method == 'GET' && !params.empty?

  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = true

  if method == 'GET'
    request = Net::HTTP::Get.new(uri)
  else
    request = Net::HTTP::Post.new(uri)
    request.set_form_data(params)
  end

  request['X-API-Key'] = API_KEY
  response = http.request(request)
  JSON.parse(response.body)
end

# 1. جلب الطلبات المتاحة
puts "=== جلب الطلبات المتاحة ==="
result = make_request('orders', 'GET', { 'filter' => 'available' })
puts result

# 2. تكليف الطلب
puts "\n=== تكليف الطلب ==="
result = make_request('assign', 'POST', { 'order_id' => 1234 })
puts result

# 3. تحديث الحالة
puts "\n=== تحديث الحالة ==="
result = make_request('update_status', 'POST', {
  'order_id'  => 1234,
  'status'    => 'in_transit',
  'location'  => 'شارع الأمير سلطان، الرياض',
  'notes'     => 'السائق في الطريق'
})
puts result

# 4. تسليم الطلب
puts "\n=== تسليم الطلب ==="
result = make_request('deliver', 'POST', {
  'order_id' => 1234,
  'notes'    => 'تم التسليم للعميل'
})
puts result
Go (Golang) - مثال كامل
package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "io"
    "net/http"
    "net/url"
)

const (
    apiKey  = "YOUR_API_KEY_HERE"
    baseURL = "https://essalmy.com/api/delivery.php"
)

func makeRequest(endpoint string, method string, data map[string]string) (map[string]interface{}, error) {
    fullURL := baseURL + "?action=" + endpoint

    var req *http.Request
    var err error

    if method == "GET" {
        params := url.Values{}
        for k, v := range data {
            params.Set(k, v)
        }
        fullURL += "&" + params.Encode()
        req, err = http.NewRequest("GET", fullURL, nil)
    } else {
        form := url.Values{}
        for k, v := range data {
            form.Set(k, v)
        }
        req, err = http.NewRequest("POST", fullURL, bytes.NewBufferString(form.Encode()))
    }

    if err != nil {
        return nil, err
    }

    req.Header.Set("X-API-Key", apiKey)
    req.Header.Set("Content-Type", "application/x-www-form-urlencoded")

    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        return nil, err
    }
    defer resp.Body.Close()

    body, _ := io.ReadAll(resp.Body)
    var result map[string]interface{}
    json.Unmarshal(body, &result)

    return result, nil
}

func main() {
    // جلب الطلبات المتاحة
    fmt.Println("=== جلب الطلبات المتاحة ===")
    orders, _ := makeRequest("orders", "GET", map[string]string{"filter": "available"})
    fmt.Println(orders)

    // تكليف الطلب
    fmt.Println("\n=== تكليف الطلب ===")
    result, _ := makeRequest("assign", "POST", map[string]string{"order_id": "1234"})
    fmt.Println(result)

    // تحديث الحالة
    fmt.Println("\n=== تحديث الحالة ===")
    result, _ = makeRequest("update_status", "POST", map[string]string{
        "order_id": "1234",
        "status":   "in_transit",
        "location": "شارع الأمير سلطان، الرياض",
    })
    fmt.Println(result)

    // تسليم الطلب
    fmt.Println("\n=== تسليم الطلب ===")
    result, _ = makeRequest("deliver", "POST", map[string]string{
        "order_id": "1234",
        "notes":    "تم التسليم للعميل",
    })
    fmt.Println(result)
}
Swift (iOS) - مثال كامل
import Foundation

class DeliveryApiClient {
    let apiKey = "YOUR_API_KEY_HERE"
    let baseUrl = "https://essalmy.com/api/delivery.php"

    // جلب الطلبات المتاحة
    func getAvailableOrders(completion: @escaping ([String: Any]?) -> Void) {
        let urlString = "\(baseUrl)?action=orders&filter=available"
        guard let url = URL(string: urlString) else { return }

        var request = URLRequest(url: url)
        request.httpMethod = "GET"
        request.setValue(apiKey, forHTTPHeaderField: "X-API-Key")
        request.setValue("application/json", forHTTPHeaderField: "Content-Type")

        URLSession.shared.dataTask(with: request) { data, response, error in
            guard let data = data,
                  let json = try? JSONSerialization.jsonObject(with: data) as? [String: Any]
            else {
                completion(nil)
                return
            }
            completion(json)
        }.resume()
    }

    // تكليف الطلب
    func assignOrder(orderId: Int, completion: @escaping ([String: Any]?) -> Void) {
        let urlString = "\(baseUrl)?action=assign"
        guard let url = URL(string: urlString) else { return }

        var request = URLRequest(url: url)
        request.httpMethod = "POST"
        request.setValue(apiKey, forHTTPHeaderField: "X-API-Key")
        request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
        request.httpBody = "order_id=\(orderId)".data(using: .utf8)

        URLSession.shared.dataTask(with: request) { data, response, error in
            guard let data = data,
                  let json = try? JSONSerialization.jsonObject(with: data) as? [String: Any]
            else {
                completion(nil)
                return
            }
            completion(json)
        }.resume()
    }

    // تحديث الحالة
    func updateStatus(orderId: Int, status: String, location: String,
                       completion: @escaping ([String: Any]?) -> Void) {
        let urlString = "\(baseUrl)?action=update_status"
        guard let url = URL(string: urlString) else { return }

        var request = URLRequest(url: url)
        request.httpMethod = "POST"
        request.setValue(apiKey, forHTTPHeaderField: "X-API-Key")
        request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")

        let body = "order_id=\(orderId)&status=\(status)&location=\(location)"
        request.httpBody = body.data(using: .utf8)

        URLSession.shared.dataTask(with: request) { data, response, error in
            guard let data = data,
                  let json = try? JSONSerialization.jsonObject(with: data) as? [String: Any]
            else {
                completion(nil)
                return
            }
            completion(json)
        }.resume()
    }

    // تسليم الطلب
    func deliverOrder(orderId: Int, notes: String,
                     completion: @escaping ([String: Any]?) -> Void) {
        let urlString = "\(baseUrl)?action=deliver"
        guard let url = URL(string: urlString) else { return }

        var request = URLRequest(url: url)
        request.httpMethod = "POST"
        request.setValue(apiKey, forHTTPHeaderField: "X-API-Key")
        request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")

        let body = "order_id=\(orderId)¬es=\(notes)"
        request.httpBody = body.data(using: .utf8)

        URLSession.shared.dataTask(with: request) { data, response, error in
            guard let data = data,
                  let json = try? JSONSerialization.jsonObject(with: data) as? [String: Any]
            else {
                completion(nil)
                return
            }
            completion(json)
        }.resume()
    }
}

// مثال الاستخدام
let api = DeliveryApiClient()
api.getAvailableOrders { result in
    print(result ?? "Error")
}
نصيحة: يمكنك نسخ أي من الأمثلة أعلاه وتشغيلها مباشرة بعد استبدال YOUR_API_KEY_HERE بمفتاح API الخاص بك.

📌 ملاحظات مهمة

⏱️
تحديد المعدل (Rate Limiting): الحد الأقصى هو 60 طلبًا في الدقيقة لكل مفتاح API. إذا تجاوزت هذا الحد، ستحصل على خطأ RATE_LIMIT_EXCEEDED.
🔒
عزل البيانات: كل شركة توصيل ترى فقط الطلبات المكلفة لها. لا يمكن لشركة رؤية طلبات الشركات الأخرى.
🔑
للحصول على مفتاح API: يرجى التواصل مع فريق الدعم الفني:
📧 البريد الإلكتروني: mohamed@essalmy.com
📱 واتساب: 0647167701
🌐 الموقع: essalmy.com
🔄
تحديثات الـ API: سيتم إشعارك بأي تغييرات في الـ API قبل 30 يومًا من تاريخ التفعيل. يُنصح بمراجعة هذه الوثائقيات بشكل دوري.
⚠️
تنبيه: يُمنع استخدام الـ API لأي أغراض غير قانونية أو احتيالية. أي انتهاك سيؤدي إلى حظر المفتاح فورًا.