Skip to content

הזמנות

גישת קריאה בלבד להזמנות המאוחסנות תחת חשבונות חברות השילוח שלכם. שלוש נקודות הקצה הן תחומות-רישיון: הן פועלות תחת רישיון (License) יחיד, שנבחר באמצעות פרמטר השאילתה license_key (ראו בחירת רישיון). הזמנה מזוהה ב-URL לפי מזהה ההזמנה החיצוני (של הפלטפורמה) — המזהה מהחנות שיצרה אותה — ולא לפי המזהה המספרי הפנימי שלה.

בחירת רישיון

נקודות קצה תחומות-רישיון פועלות תחת חשבון חברת שילוח אחד (רישיון). בוחרים אותו באמצעות פרמטר השאילתה license_key, שערכו הוא ה-key של הרישיון. אם לחשבון יש בדיוק רישיון פעיל אחד — הוא משמש כברירת מחדל; כשיש כמה, license_key הוא חובה (אחרת 422); מפתח חסר, לא פעיל, שפג תוקפו או שאינו בבעלותכם מחזיר 403.


GET /orders

רשימת הזמנות הקורא עבור הרישיון הנבחר, מהחדשה לישנה, עם עימוד מבוסס cursor. אימות: client credentials. רישיון: חובה.

פרמטרים

שאילתה

שדהסוגחובהתיאור
license_keystringמותנהה-key של הרישיון לפעול תחתיו. חובה כאשר לחשבון יותר מרישיון פעיל אחד.
per_pageintegerלאמספר הזמנות בעמוד. ברירת מחדל 25, מוגבל ל-100.
cursorstringלאCursor עימוד אטום. השתמשו בערך meta.next_cursor / meta.prev_cursor שהוחזר בקריאה קודמת כדי לדפדף בתוצאות.

בקשה לדוגמה

bash
curl --location 'https://app.shipos.co.il/api/v2/orders?per_page=25' \
--header 'X-Client-Id: {client_id}' \
--header 'X-Client-Secret: {client_secret}' \
--header 'Accept: application/json'
js
// Node.js 18+ / דפדפנים — ללא תלויות
const query = new URLSearchParams({ per_page: '25' })

const response = await fetch(`https://app.shipos.co.il/api/v2/orders?${query}`, {
  headers: {
    'X-Client-Id': process.env.SHIPOS_CLIENT_ID,
    'X-Client-Secret': process.env.SHIPOS_CLIENT_SECRET,
    Accept: 'application/json',
  },
})

if (!response.ok) {
  const { error } = await response.json()
  throw new Error(`${error.code}: ${error.message}`)
}

const { data: orders, meta } = await response.json()

for (const order of orders) {
  console.log(order.order_id, order.total, order.currency)
}
console.log('next cursor:', meta.next_cursor)
php
<?php
// composer require guzzlehttp/guzzle

$client = new \GuzzleHttp\Client([
    'base_uri' => 'https://app.shipos.co.il/api/v2/',
    'headers' => [
        'X-Client-Id' => getenv('SHIPOS_CLIENT_ID'),
        'X-Client-Secret' => getenv('SHIPOS_CLIENT_SECRET'),
        'Accept' => 'application/json',
    ],
]);

$response = $client->get('orders', ['query' => ['per_page' => 25]]);
$payload = json_decode($response->getBody()->getContents(), true);

foreach ($payload['data'] as $order) {
    echo $order['order_id'], ' ', $order['total'], ' ', $order['currency'], PHP_EOL;
}
echo 'next cursor: ', $payload['meta']['next_cursor'] ?? '-', PHP_EOL;
php
<?php

use Illuminate\Support\Facades\Http;

$payload = Http::withHeaders([
    'X-Client-Id' => config('services.shipos.client_id'),
    'X-Client-Secret' => config('services.shipos.client_secret'),
])
    ->acceptJson()
    ->get('https://app.shipos.co.il/api/v2/orders', ['per_page' => 25])
    ->throw()
    ->json();

foreach ($payload['data'] as $order) {
    logger()->info($order['order_id'].' '.$order['total'].' '.$order['currency']);
}
logger()->info('next cursor: '.($payload['meta']['next_cursor'] ?? '-'));
python
# pip install httpx
import os

import httpx

response = httpx.get(
    "https://app.shipos.co.il/api/v2/orders",
    params={"per_page": 25},
    headers={
        "X-Client-Id": os.environ["SHIPOS_CLIENT_ID"],
        "X-Client-Secret": os.environ["SHIPOS_CLIENT_SECRET"],
        "Accept": "application/json",
    },
)
response.raise_for_status()
payload = response.json()

for order in payload["data"]:
    print(order["order_id"], order["total"], order["currency"])
print("next cursor:", payload["meta"]["next_cursor"])
go
package main

import (
	"encoding/json"
	"fmt"
	"net/http"
	"net/url"
	"os"
)

type ordersResponse struct {
	Data []struct {
		OrderID  string `json:"order_id"`
		Total    string `json:"total"`
		Currency string `json:"currency"`
	} `json:"data"`
	Meta struct {
		NextCursor *string `json:"next_cursor"`
	} `json:"meta"`
}

func main() {
	query := url.Values{"per_page": {"25"}}
	req, _ := http.NewRequest("GET",
		"https://app.shipos.co.il/api/v2/orders?"+query.Encode(), nil)
	req.Header.Set("X-Client-Id", os.Getenv("SHIPOS_CLIENT_ID"))
	req.Header.Set("X-Client-Secret", os.Getenv("SHIPOS_CLIENT_SECRET"))
	req.Header.Set("Accept", "application/json")

	res, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()

	var payload ordersResponse
	if err := json.NewDecoder(res.Body).Decode(&payload); err != nil {
		panic(err)
	}

	for _, order := range payload.Data {
		fmt.Println(order.OrderID, order.Total, order.Currency)
	}
}
java
// Java 17+ — java.net.http, ללא תלויות (פענוח עם Jackson/Gson)
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class ShipOsOrders {
    public static void main(String[] args) throws Exception {
        String query = "per_page=25";

        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://app.shipos.co.il/api/v2/orders?" + query))
            .header("X-Client-Id", System.getenv("SHIPOS_CLIENT_ID"))
            .header("X-Client-Secret", System.getenv("SHIPOS_CLIENT_SECRET"))
            .header("Accept", "application/json")
            .build();

        HttpResponse<String> response = HttpClient.newHttpClient()
            .send(request, HttpResponse.BodyHandlers.ofString());

        if (response.statusCode() != 200) {
            throw new RuntimeException("ShipOS error: " + response.body());
        }

        System.out.println(response.body()); // {"data":[...],"meta":{...}}
    }
}
csharp
// .NET 8+ — System.Net.Http.Json
using System.Net.Http.Json;
using System.Text.Json;

using var http = new HttpClient
{
    BaseAddress = new Uri("https://app.shipos.co.il/api/v2/"),
};
http.DefaultRequestHeaders.Add("X-Client-Id",
    Environment.GetEnvironmentVariable("SHIPOS_CLIENT_ID"));
http.DefaultRequestHeaders.Add("X-Client-Secret",
    Environment.GetEnvironmentVariable("SHIPOS_CLIENT_SECRET"));

var payload = await http.GetFromJsonAsync<JsonDocument>("orders?per_page=25")
    ?? throw new InvalidOperationException("Empty response");

foreach (var order in payload.RootElement.GetProperty("data").EnumerateArray())
{
    Console.WriteLine($"{order.GetProperty("order_id").GetString()} " +
        $"{order.GetProperty("total").GetString()}");
}
ruby
require "net/http"
require "json"

uri = URI("https://app.shipos.co.il/api/v2/orders")
uri.query = URI.encode_www_form(per_page: 25)

request = Net::HTTP::Get.new(uri)
request["X-Client-Id"] = ENV.fetch("SHIPOS_CLIENT_ID")
request["X-Client-Secret"] = ENV.fetch("SHIPOS_CLIENT_SECRET")
request["Accept"] = "application/json"

response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
  http.request(request)
end

raise "ShipOS error: #{response.body}" unless response.is_a?(Net::HTTPSuccess)

payload = JSON.parse(response.body)

payload["data"].each { |order| puts "#{order["order_id"]} #{order["total"]}" }
puts "next cursor: #{payload.dig("meta", "next_cursor")}"
rust
// [dependencies]
// reqwest = { version = "0.12", features = ["json"] }
// tokio = { version = "1", features = ["full"] }
// serde_json = "1"
use serde_json::Value;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let payload: Value = reqwest::Client::new()
        .get("https://app.shipos.co.il/api/v2/orders")
        .query(&[("per_page", "25")])
        .header("X-Client-Id", std::env::var("SHIPOS_CLIENT_ID")?)
        .header("X-Client-Secret", std::env::var("SHIPOS_CLIENT_SECRET")?)
        .header("Accept", "application/json")
        .send()
        .await?
        .error_for_status()?
        .json()
        .await?;

    if let Some(orders) = payload["data"].as_array() {
        for order in orders {
            println!("{} {}", order["order_id"], order["total"]);
        }
    }
    println!("next cursor: {}", payload["meta"]["next_cursor"]);
    Ok(())
}

תגובה 200

הרשימה מעומדת באמצעות cursor. כל פריט הוא הזמנה (ראו את מדריך השדות תחת GET /orders/{order}). המפתח shipments מושמט מפריטי הרשימה — הוא קיים רק כאשר יחס המשלוחים של ההזמנה נטען, וזה קורה בנקודת הקצה של הזמנה בודדת.

json
{
  "data": [
    {
      "id": 84213,
      "order_id": "19602",
      "number": "19602",
      "source": "woocommerce",
      "total": "245.00",
      "currency": "ILS",
      "billing": {
        "first_name": "ישראל",
        "last_name": "ישראלי",
        "address_1": "הרצל 10",
        "city": "תל אביב",
        "email": "israel@example.com",
        "phone": "0521234567"
      },
      "shipping": {
        "first_name": "ישראל",
        "last_name": "ישראלי",
        "address_1": "הרצל 10",
        "city": "תל אביב"
      },
      "created_at": "2026-07-20T08:14:11.000000Z",
      "updated_at": "2026-07-20T08:15:02.000000Z"
    }
  ],
  "links": {
    "first": null,
    "last": null,
    "prev": null,
    "next": "https://app.shipos.co.il/api/v2/orders?cursor=eyJpZCI6ODQyMTN9"
  },
  "meta": {
    "path": "https://app.shipos.co.il/api/v2/orders",
    "per_page": 25,
    "next_cursor": "eyJpZCI6ODQyMTN9",
    "prev_cursor": null
  }
}

billing ו-shipping מועברים כפי שהם מאוחסנים על ההזמנה, ולכן המפתחות המדויקים שלהם משתנים לפי פלטפורמת המקור.

שגיאות

סטטוסקודמתי
401unauthenticatedפרטי הזדהות (client credentials) חסרים או שגויים.
403forbiddenלחשבון אין רישיון פעיל, או שה-license_key שסופק אינו פעיל / פג תוקף / אינו בבעלותכם.
422validation_failedלחשבון יותר מרישיון פעיל אחד ו-license_key לא סופק.

GET /orders/

מחזיר הזמנה בודדת יחד עם המשלוחים שלה. אימות: client credentials. רישיון: חובה.

פרמטרים

נתיב

שדהסוגחובהתיאור
orderstringכןמזהה ההזמנה החיצוני (של הפלטפורמה) (order_id) של ההזמנה — מזהה ההזמנה של החנות עצמה, לא ה-id המספרי הפנימי. חייב להשתייך לרישיון הנבחר.

שאילתה

שדהסוגחובהתיאור
license_keystringמותנהה-key של הרישיון לפעול תחתיו. חובה כאשר לחשבון יותר מרישיון פעיל אחד.

בקשה לדוגמה

bash
curl --location 'https://app.shipos.co.il/api/v2/orders/19602' \
--header 'X-Client-Id: {client_id}' \
--header 'X-Client-Secret: {client_secret}' \
--header 'Accept: application/json'
js
// Node.js 18+ / דפדפנים — ללא תלויות
const orderId = '19602'

const response = await fetch(`https://app.shipos.co.il/api/v2/orders/${orderId}`, {
  headers: {
    'X-Client-Id': process.env.SHIPOS_CLIENT_ID,
    'X-Client-Secret': process.env.SHIPOS_CLIENT_SECRET,
    Accept: 'application/json',
  },
})

if (!response.ok) {
  const { error } = await response.json()
  throw new Error(`${error.code}: ${error.message}`)
}

const { data: order } = await response.json()

console.log(order.order_id, order.total, order.currency)
for (const shipment of order.shipments) {
  console.log(shipment.tracking_code, shipment.status?.description)
}
php
<?php
// composer require guzzlehttp/guzzle

$client = new \GuzzleHttp\Client([
    'base_uri' => 'https://app.shipos.co.il/api/v2/',
    'headers' => [
        'X-Client-Id' => getenv('SHIPOS_CLIENT_ID'),
        'X-Client-Secret' => getenv('SHIPOS_CLIENT_SECRET'),
        'Accept' => 'application/json',
    ],
]);

$order = json_decode(
    $client->get('orders/19602')->getBody()->getContents(),
    true,
)['data'];

echo $order['order_id'], ' ', $order['total'], PHP_EOL;
foreach ($order['shipments'] as $shipment) {
    echo $shipment['tracking_code'], PHP_EOL;
}
php
<?php

use Illuminate\Support\Facades\Http;

$order = Http::withHeaders([
    'X-Client-Id' => config('services.shipos.client_id'),
    'X-Client-Secret' => config('services.shipos.client_secret'),
])
    ->acceptJson()
    ->get('https://app.shipos.co.il/api/v2/orders/19602')
    ->throw()
    ->json('data');

logger()->info($order['order_id'].' '.$order['total']);
foreach ($order['shipments'] as $shipment) {
    logger()->info($shipment['tracking_code']);
}
python
# pip install httpx
import os

import httpx

response = httpx.get(
    "https://app.shipos.co.il/api/v2/orders/19602",
    headers={
        "X-Client-Id": os.environ["SHIPOS_CLIENT_ID"],
        "X-Client-Secret": os.environ["SHIPOS_CLIENT_SECRET"],
        "Accept": "application/json",
    },
)
response.raise_for_status()
order = response.json()["data"]

print(order["order_id"], order["total"], order["currency"])
for shipment in order["shipments"]:
    print(shipment["tracking_code"])
go
package main

import (
	"encoding/json"
	"fmt"
	"net/http"
	"os"
)

type orderResponse struct {
	Data struct {
		OrderID   string `json:"order_id"`
		Total     string `json:"total"`
		Shipments []struct {
			TrackingCode string `json:"tracking_code"`
		} `json:"shipments"`
	} `json:"data"`
}

func main() {
	req, _ := http.NewRequest("GET",
		"https://app.shipos.co.il/api/v2/orders/19602", nil)
	req.Header.Set("X-Client-Id", os.Getenv("SHIPOS_CLIENT_ID"))
	req.Header.Set("X-Client-Secret", os.Getenv("SHIPOS_CLIENT_SECRET"))
	req.Header.Set("Accept", "application/json")

	res, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()

	var payload orderResponse
	if err := json.NewDecoder(res.Body).Decode(&payload); err != nil {
		panic(err)
	}

	fmt.Println(payload.Data.OrderID, payload.Data.Total)
	for _, shipment := range payload.Data.Shipments {
		fmt.Println(shipment.TrackingCode)
	}
}
java
// Java 17+ — java.net.http, ללא תלויות (פענוח עם Jackson/Gson)
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class ShipOsOrder {
    public static void main(String[] args) throws Exception {
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://app.shipos.co.il/api/v2/orders/19602"))
            .header("X-Client-Id", System.getenv("SHIPOS_CLIENT_ID"))
            .header("X-Client-Secret", System.getenv("SHIPOS_CLIENT_SECRET"))
            .header("Accept", "application/json")
            .build();

        HttpResponse<String> response = HttpClient.newHttpClient()
            .send(request, HttpResponse.BodyHandlers.ofString());

        if (response.statusCode() != 200) {
            throw new RuntimeException("ShipOS error: " + response.body());
        }

        System.out.println(response.body()); // {"data":{...}}
    }
}
csharp
// .NET 8+ — System.Net.Http.Json
using System.Net.Http.Json;
using System.Text.Json;

using var http = new HttpClient
{
    BaseAddress = new Uri("https://app.shipos.co.il/api/v2/"),
};
http.DefaultRequestHeaders.Add("X-Client-Id",
    Environment.GetEnvironmentVariable("SHIPOS_CLIENT_ID"));
http.DefaultRequestHeaders.Add("X-Client-Secret",
    Environment.GetEnvironmentVariable("SHIPOS_CLIENT_SECRET"));

var payload = await http.GetFromJsonAsync<JsonDocument>("orders/19602")
    ?? throw new InvalidOperationException("Empty response");
var order = payload.RootElement.GetProperty("data");

Console.WriteLine($"{order.GetProperty("order_id").GetString()} " +
    $"{order.GetProperty("total").GetString()}");
foreach (var shipment in order.GetProperty("shipments").EnumerateArray())
{
    Console.WriteLine(shipment.GetProperty("tracking_code").GetString());
}
ruby
require "net/http"
require "json"

uri = URI("https://app.shipos.co.il/api/v2/orders/19602")
request = Net::HTTP::Get.new(uri)
request["X-Client-Id"] = ENV.fetch("SHIPOS_CLIENT_ID")
request["X-Client-Secret"] = ENV.fetch("SHIPOS_CLIENT_SECRET")
request["Accept"] = "application/json"

response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
  http.request(request)
end

raise "ShipOS error: #{response.body}" unless response.is_a?(Net::HTTPSuccess)

order = JSON.parse(response.body).fetch("data")

puts "#{order["order_id"]} #{order["total"]}"
order["shipments"].each { |shipment| puts shipment["tracking_code"] }
rust
// [dependencies]
// reqwest = { version = "0.12", features = ["json"] }
// tokio = { version = "1", features = ["full"] }
// serde_json = "1"
use serde_json::Value;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let payload: Value = reqwest::Client::new()
        .get("https://app.shipos.co.il/api/v2/orders/19602")
        .header("X-Client-Id", std::env::var("SHIPOS_CLIENT_ID")?)
        .header("X-Client-Secret", std::env::var("SHIPOS_CLIENT_SECRET")?)
        .header("Accept", "application/json")
        .send()
        .await?
        .error_for_status()?
        .json()
        .await?;

    let order = &payload["data"];
    println!("{} {}", order["order_id"], order["total"]);
    if let Some(shipments) = order["shipments"].as_array() {
        for shipment in shipments {
            println!("{}", shipment["tracking_code"]);
        }
    }
    Ok(())
}

תגובה 200

shipments קיים כאן משום שיחס המשלוחים נטען. זהו מערך של משאבי משלוח (ראו GET /orders/{order}/shipments למדריך שדות המשלוח).

json
{
  "data": {
    "id": 84213,
    "order_id": "19602",
    "number": "19602",
    "source": "woocommerce",
    "total": "245.00",
    "currency": "ILS",
    "billing": {
      "first_name": "ישראל",
      "last_name": "ישראלי",
      "address_1": "הרצל 10",
      "city": "תל אביב",
      "email": "israel@example.com",
      "phone": "0521234567"
    },
    "shipping": {
      "first_name": "ישראל",
      "last_name": "ישראלי",
      "address_1": "הרצל 10",
      "city": "תל אביב"
    },
    "shipments": [
      {
        "uuid": "9f1c2d34-5678-4abc-9012-3456789abcde",
        "tracking_code": "66747921",
        "service_type": "home",
        "status": {
          "code": "1",
          "description": "נמסר",
          "is_delivered": true
        },
        "is_active": true
      }
    ],
    "created_at": "2026-07-20T08:14:11.000000Z",
    "updated_at": "2026-07-20T08:15:02.000000Z"
  }
}

שדות הזמנה

שדהסוגתיאור
idintegerמזהה הזמנה פנימי של ShipOS.
order_idstringמזהה הזמנה חיצוני (של הפלטפורמה) — הערך שבשימוש ב-URL.
numberstringמספר ההזמנה כפי שמוצג לסוחר/ללקוח.
sourcestringהפלטפורמה שממנה הגיעה ההזמנה (למשל woocommerce, shopify, wix, api_v2).
totalstringסכום ההזמנה.
currencystringקוד מטבע ISO.
billingobjectפרטי החיוב כפי שמאוחסנים על ההזמנה (המפתחות משתנים לפי פלטפורמה).
shippingobjectפרטי המשלוח/הנמען כפי שמאוחסנים על ההזמנה (המפתחות משתנים לפי פלטפורמה).
shipmentsarrayהמשלוחים המשויכים להזמנה. קיים רק בנקודת הקצה של הזמנה בודדת.
created_atstringחותמת זמן בפורמט ISO 8601.
updated_atstringחותמת זמן בפורמט ISO 8601.

מזהי קישור לפלטפורמה, מזהים פנימיים, פירוטי מס/הנחה ואמצעי תשלום/משלוח מוחרגים בכוונה מחוזה v2.

שגיאות

סטטוסקודמתי
401unauthenticatedפרטי הזדהות (client credentials) חסרים או שגויים.
403forbiddenהרישיון אינו שמיש (ראו בחירת רישיון).
404not_foundאף הזמנה עם המזהה החיצוני הזה אינה שייכת לרישיון הנבחר.
422validation_failedמספר רישיונות פעילים ו-license_key הושמט.

GET /orders/{order}/shipments

רשימת המשלוחים המשויכים להזמנה בודדת. אימות: client credentials. רישיון: חובה.

פרמטרים

נתיב

שדהסוגחובהתיאור
orderstringכןמזהה ההזמנה החיצוני (של הפלטפורמה) (order_id). חייב להשתייך לרישיון הנבחר.

שאילתה

שדהסוגחובהתיאור
license_keystringמותנהה-key של הרישיון לפעול תחתיו. חובה כאשר לחשבון יותר מרישיון פעיל אחד.

בקשה לדוגמה

bash
curl --location 'https://app.shipos.co.il/api/v2/orders/19602/shipments' \
--header 'X-Client-Id: {client_id}' \
--header 'X-Client-Secret: {client_secret}' \
--header 'Accept: application/json'
js
// Node.js 18+ / דפדפנים — ללא תלויות
const orderId = '19602'

const response = await fetch(
  `https://app.shipos.co.il/api/v2/orders/${orderId}/shipments`,
  {
    headers: {
      'X-Client-Id': process.env.SHIPOS_CLIENT_ID,
      'X-Client-Secret': process.env.SHIPOS_CLIENT_SECRET,
      Accept: 'application/json',
    },
  },
)

if (!response.ok) {
  const { error } = await response.json()
  throw new Error(`${error.code}: ${error.message}`)
}

const { data: shipments } = await response.json()

for (const shipment of shipments) {
  console.log(shipment.tracking_code, shipment.service_type, shipment.status?.description)
}
php
<?php
// composer require guzzlehttp/guzzle

$client = new \GuzzleHttp\Client([
    'base_uri' => 'https://app.shipos.co.il/api/v2/',
    'headers' => [
        'X-Client-Id' => getenv('SHIPOS_CLIENT_ID'),
        'X-Client-Secret' => getenv('SHIPOS_CLIENT_SECRET'),
        'Accept' => 'application/json',
    ],
]);

$shipments = json_decode(
    $client->get('orders/19602/shipments')->getBody()->getContents(),
    true,
)['data'];

foreach ($shipments as $shipment) {
    echo $shipment['tracking_code'], ' ', $shipment['service_type'], PHP_EOL;
}
php
<?php

use Illuminate\Support\Facades\Http;

$shipments = Http::withHeaders([
    'X-Client-Id' => config('services.shipos.client_id'),
    'X-Client-Secret' => config('services.shipos.client_secret'),
])
    ->acceptJson()
    ->get('https://app.shipos.co.il/api/v2/orders/19602/shipments')
    ->throw()
    ->json('data');

foreach ($shipments as $shipment) {
    logger()->info($shipment['tracking_code'].' '.$shipment['service_type']);
}
python
# pip install httpx
import os

import httpx

response = httpx.get(
    "https://app.shipos.co.il/api/v2/orders/19602/shipments",
    headers={
        "X-Client-Id": os.environ["SHIPOS_CLIENT_ID"],
        "X-Client-Secret": os.environ["SHIPOS_CLIENT_SECRET"],
        "Accept": "application/json",
    },
)
response.raise_for_status()
shipments = response.json()["data"]

for shipment in shipments:
    print(shipment["tracking_code"], shipment["service_type"])
go
package main

import (
	"encoding/json"
	"fmt"
	"net/http"
	"os"
)

type shipmentsResponse struct {
	Data []struct {
		TrackingCode string `json:"tracking_code"`
		ServiceType  string `json:"service_type"`
	} `json:"data"`
}

func main() {
	req, _ := http.NewRequest("GET",
		"https://app.shipos.co.il/api/v2/orders/19602/shipments", nil)
	req.Header.Set("X-Client-Id", os.Getenv("SHIPOS_CLIENT_ID"))
	req.Header.Set("X-Client-Secret", os.Getenv("SHIPOS_CLIENT_SECRET"))
	req.Header.Set("Accept", "application/json")

	res, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()

	var payload shipmentsResponse
	if err := json.NewDecoder(res.Body).Decode(&payload); err != nil {
		panic(err)
	}

	for _, shipment := range payload.Data {
		fmt.Println(shipment.TrackingCode, shipment.ServiceType)
	}
}
java
// Java 17+ — java.net.http, ללא תלויות (פענוח עם Jackson/Gson)
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class ShipOsOrderShipments {
    public static void main(String[] args) throws Exception {
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://app.shipos.co.il/api/v2/orders/19602/shipments"))
            .header("X-Client-Id", System.getenv("SHIPOS_CLIENT_ID"))
            .header("X-Client-Secret", System.getenv("SHIPOS_CLIENT_SECRET"))
            .header("Accept", "application/json")
            .build();

        HttpResponse<String> response = HttpClient.newHttpClient()
            .send(request, HttpResponse.BodyHandlers.ofString());

        if (response.statusCode() != 200) {
            throw new RuntimeException("ShipOS error: " + response.body());
        }

        System.out.println(response.body()); // {"data":[...]}
    }
}
csharp
// .NET 8+ — System.Net.Http.Json
using System.Net.Http.Json;
using System.Text.Json;

using var http = new HttpClient
{
    BaseAddress = new Uri("https://app.shipos.co.il/api/v2/"),
};
http.DefaultRequestHeaders.Add("X-Client-Id",
    Environment.GetEnvironmentVariable("SHIPOS_CLIENT_ID"));
http.DefaultRequestHeaders.Add("X-Client-Secret",
    Environment.GetEnvironmentVariable("SHIPOS_CLIENT_SECRET"));

var payload = await http.GetFromJsonAsync<JsonDocument>("orders/19602/shipments")
    ?? throw new InvalidOperationException("Empty response");

foreach (var shipment in payload.RootElement.GetProperty("data").EnumerateArray())
{
    Console.WriteLine($"{shipment.GetProperty("tracking_code").GetString()} " +
        $"{shipment.GetProperty("service_type").GetString()}");
}
ruby
require "net/http"
require "json"

uri = URI("https://app.shipos.co.il/api/v2/orders/19602/shipments")
request = Net::HTTP::Get.new(uri)
request["X-Client-Id"] = ENV.fetch("SHIPOS_CLIENT_ID")
request["X-Client-Secret"] = ENV.fetch("SHIPOS_CLIENT_SECRET")
request["Accept"] = "application/json"

response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
  http.request(request)
end

raise "ShipOS error: #{response.body}" unless response.is_a?(Net::HTTPSuccess)

JSON.parse(response.body).fetch("data").each do |shipment|
  puts "#{shipment["tracking_code"]} #{shipment["service_type"]}"
end
rust
// [dependencies]
// reqwest = { version = "0.12", features = ["json"] }
// tokio = { version = "1", features = ["full"] }
// serde_json = "1"
use serde_json::Value;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let payload: Value = reqwest::Client::new()
        .get("https://app.shipos.co.il/api/v2/orders/19602/shipments")
        .header("X-Client-Id", std::env::var("SHIPOS_CLIENT_ID")?)
        .header("X-Client-Secret", std::env::var("SHIPOS_CLIENT_SECRET")?)
        .header("Accept", "application/json")
        .send()
        .await?
        .error_for_status()?
        .json()
        .await?;

    if let Some(shipments) = payload["data"].as_array() {
        for shipment in shipments {
            println!("{} {}", shipment["tracking_code"], shipment["service_type"]);
        }
    }
    Ok(())
}

תגובה 200

json
{
  "data": [
    {
      "uuid": "9f1c2d34-5678-4abc-9012-3456789abcde",
      "tracking_code": "66747921",
      "status": {
        "code": "1",
        "description": "נמסר",
        "is_delivered": true
      },
      "service_type": "home",
      "is_active": true,
      "recipient": {
        "name": "ישראל ישראלי",
        "phone": "0521234567",
        "company": null,
        "address": {
          "street": "הרצל 10",
          "number": "10",
          "city": "תל אביב",
          "state": null,
          "zip": "6100000",
          "country": "IL"
        }
      },
      "pickup_point_id": null,
      "packages": 1,
      "cod": null,
      "order": {
        "id": "19602",
        "number": null
      },
      "references": {
        "external_id": null
      },
      "short_tracking_code": null,
      "label_generated": true,
      "collection_status": null,
      "collected_at": null,
      "ready_at": null,
      "created_at": "2026-07-20T08:15:02.000000Z",
      "updated_at": "2026-07-20T08:20:44.000000Z"
    }
  ]
}

שדות משלוח

שדהסוגתיאור
uuidstringמזהה משלוח ציבורי.
tracking_codestringקוד מעקב / קוד משלוח של חברת השילוח.
carrierobjectחברת שילוח { id, name }. קיים רק כאשר יחס הספק נטען.
statusobject | null{ code, description, is_delivered } — מפתחות עם ערכי null מושמטים; הבלוק כולו הוא null כאשר אין סטטוס.
service_typestringאחד מסוגי השירות (home, pickup, exchange, return).
is_activebooleanהאם המשלוח פעיל (לא בוטל).
recipientobject{ name, phone, company, address{ street, number, city, state, zip, country } }.
pickup_point_idstring | nullמזהה נקודת האיסוף שנבחרה, עבור משלוחי נקודת איסוף.
packagesmixed | nullמספר חבילות / נתוני חבילות שנקלטו ביצירה.
codobject | null{ amount } כאשר מדובר בתשלום במזומן במסירה (COD), אחרת null.
orderobject{ id, number } — מזהה ההזמנה החיצוני, ומספר ההזמנה כאשר יחס ההזמנה נטען.
referencesobject{ external_id } — הפניה חיצונית שסופקה על-ידי הקורא, כאשר הוגדרה.
short_tracking_codestring | nullקוד מעקב מקוצר (בתהליכי נקודות איסוף).
label_generatedbooleanהאם נוצרה תווית משלוח.
collection_statusstring | nullסטטוס מחזור חיי האיסוף.
collected_atstring | nullחותמת זמן ISO 8601 של האיסוף.
ready_atstring | nullחותמת זמן ISO 8601 של מוכנות לאיסוף.
created_atstringחותמת זמן בפורמט ISO 8601.
updated_atstringחותמת זמן בפורמט ISO 8601.

מטעני נתונים גולמיים של חברת השילוח, דגלי סנכרון פלטפורמה ומזהים פנימיים מוחרגים בכוונה מחוזה v2.

שגיאות

סטטוסקודמתי
401unauthenticatedפרטי הזדהות (client credentials) חסרים או שגויים.
403forbiddenהרישיון אינו שמיש (ראו בחירת רישיון).
404not_foundאף הזמנה עם המזהה החיצוני הזה אינה שייכת לרישיון הנבחר.
422validation_failedמספר רישיונות פעילים ו-license_key הושמט.