Skip to content

רישיונות

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

אזהרה — מידע רגיש

בלוק ה-settings של כל רישיון נחשף במלואו, כולל ה-JSON הגולמי של הגדרות הספק (settings), שמכיל פרטי הזדהות של חברת השילוח (username / password / token / api_key / api_secret / client_code / printer_api_key / …). התייחסו לתגובה זו כאל סוד. ה-key של הרישיון עצמו כלול כדי שתוכלו להשתמש בו כ-license_key.


GET /licenses

רשימת כל חשבונות חברות השילוח (רישיונות) שבבעלות הלקוח המאומת, ממוינים לפי id. אימות: client credentials. רישיון: לא רלוונטי — נקודת קצה זו מחזירה את כל רישיונות הלקוח ואינה דורשת license_key.

פרמטרים

אין.

בקשה לדוגמה

bash
curl --location 'https://app.shipos.co.il/api/v2/licenses' \
--header 'X-Client-Id: {client_id}' \
--header 'X-Client-Secret: {client_secret}' \
--header 'Accept: application/json'
js
// Node.js 18+ / דפדפנים — בלי תלויות
const response = await fetch('https://app.shipos.co.il/api/v2/licenses', {
  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: licenses } = await response.json()

for (const license of licenses) {
  console.log(license.key, '→', license.company.carrier.name)
}
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',
    ],
]);

$licenses = json_decode(
    $client->get('licenses')->getBody()->getContents(),
    true,
)['data'];

foreach ($licenses as $license) {
    echo $license['key'], ' → ', $license['company']['carrier']['name'], PHP_EOL;
}
php
<?php

use Illuminate\Support\Facades\Http;

$licenses = 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/licenses')
    ->throw()
    ->json('data');

foreach ($licenses as $license) {
    logger()->info($license['key'].' → '.$license['company']['carrier']['name']);
}
python
# pip install httpx
import os

import httpx

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

for lic in licenses:
    print(lic["key"], "→", lic["company"]["carrier"]["name"])
go
package main

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

type licensesResponse struct {
	Data []struct {
		Key     string `json:"key"`
		Company struct {
			Carrier struct {
				Name string `json:"name"`
			} `json:"carrier"`
		} `json:"company"`
	} `json:"data"`
}

func main() {
	req, _ := http.NewRequest("GET",
		"https://app.shipos.co.il/api/v2/licenses", 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 licensesResponse
	if err := json.NewDecoder(res.Body).Decode(&payload); err != nil {
		panic(err)
	}

	for _, license := range payload.Data {
		fmt.Println(license.Key, "→", license.Company.Carrier.Name)
	}
}
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 ShipOsLicenses {
    public static void main(String[] args) throws Exception {
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://app.shipos.co.il/api/v2/licenses"))
            .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":[...]} — contains credentials
    }
}
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>("licenses")
    ?? throw new InvalidOperationException("Empty response");

foreach (var license in payload.RootElement.GetProperty("data").EnumerateArray())
{
    var carrier = license.GetProperty("company").GetProperty("carrier");
    Console.WriteLine($"{license.GetProperty("key").GetString()} → " +
        $"{carrier.GetProperty("name").GetString()}");
}
ruby
require "net/http"
require "json"

uri = URI("https://app.shipos.co.il/api/v2/licenses")
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 |license|
  puts "#{license["key"]}#{license.dig("company", "carrier", "name")}"
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/licenses")
        .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(licenses) = payload["data"].as_array() {
        for license in licenses {
            println!(
                "{} → {}",
                license["key"], license["company"]["carrier"]["name"]
            );
        }
    }
    Ok(())
}

תגובה 200

כל פריט מטמיע את ה-company שלו (עם carrier מקונן) ואת ה-settings שלו (שורה אחת לכל ספק).

json
{
  "data": [
    {
      "id": 812,
      "key": "a1b2c3d4e5f6",
      "name": "חשבון HFD ראשי",
      "company": {
        "id": 3391,
        "name": "בלדר לוגיסטיקה בע\"מ",
        "carrier": {
          "id": 4,
          "name": "HFD"
        }
      },
      "commitment_day": 3,
      "multiple_shipment": true,
      "is_active": true,
      "is_expired": false,
      "expires_at": "2027-01-31T00:00:00.000000Z",
      "settings": [
        {
          "id": 2201,
          "provider_id": 4,
          "settings": {
            "username": "shipos",
            "token": "eyJhbGciOi...",
            "client_code": "14641"
          },
          "collect_street": "הרצל",
          "collect_street_number": "10",
          "collect_city": "תל אביב",
          "collect_company": "בלדר לוגיסטיקה בע\"מ",
          "print_products": true,
          "print_variations": false,
          "print_customer_detail_sku_and_quantity_bold_in_label": false,
          "print_products_on_label_notes": false,
          "print_products_on_a4_label_notes": false,
          "print_products_name": true,
          "print_products_sku": false,
          "print_virtual_product_on_note": false,
          "enable_cod": true,
          "label_method": "pdf",
          "label_type": "a4",
          "separate_street_and_number": true,
          "get_street_number_with_suffix": false,
          "display_shipping_line_number": false,
          "order_prefix": "SO-",
          "send_note_on_order": false,
          "created_at": "2026-01-31T00:00:00.000000Z",
          "updated_at": "2026-07-01T10:22:14.000000Z"
        }
      ]
    }
  ]
}

שדות רישיון

שדהסוגתיאור
idintegerמזהה רישיון פנימי.
keystringפרט ההזדהות של הרישיון. זה הערך שיש להעביר כ-license_key בנקודות קצה תחומות-רישיון.
namestring | nullשם הרישיון המוצג למשתמש.
companyobjectחברת השליחויות שאליה שייך הרישיון (ראו בהמשך).
commitment_dayinteger | nullהגדרת יום ההתחייבות של חברת השילוח.
multiple_shipmentbooleanהאם הרישיון מתיר משלוחים מרובים להזמנה.
is_activebooleanהאם הרישיון פעיל.
is_expiredbooleanהאם תוקף הרישיון פג.
expires_atstring | nullחותמת זמן פקיעה בפורמט ISO 8601.
settingsarrayשורות הגדרות לכל ספק (ראו בהמשך).

company

שדהסוגתיאור
idintegerמזהה החברה.
namestringשם החברה.
carrierobjectחברת השילוח (ספק) { id, name }. קיים כאשר יחס הספק נטען (וזה המצב בנקודת קצה זו).

carrier

שדהסוגתיאור
idintegerמזהה חברת השילוח (ספק).
namestringשם חברת השילוח (למשל HFD, Cargo, Zigzag).

settings[]

שורת license_settings מלאה עבור הספק. ה-JSON המקונן של settings מקוצץ מערכים ריקים — מפתחות שערכם null, מחרוזת ריקה או מערך ריק (רקורסיבית) מושמטים; ערכים בוליאניים תמיד נשמרים (גם true וגם false משמעותיים), וכך גם 0 וסקלרים ממשיים אחרים.

שדהסוגתיאור
idintegerמזהה שורת ההגדרות.
provider_idintegerמזהה הספק (חברת השילוח) שעליו חלות ההגדרות.
settingsobjectJSON גולמי של הגדרות הספק, לאחר קיצוץ ערכים ריקים. מכיל פרטי הזדהות של חברת השילוח.
collect_streetstring | nullכתובת איסוף — רחוב.
collect_street_numberstring | nullכתובת איסוף — מספר רחוב.
collect_citystring | nullכתובת איסוף — עיר.
collect_companystring | nullכתובת איסוף — חברה.
print_productsbool | nullאפשרות הדפסת תווית.
print_variationsbool | nullאפשרות הדפסת תווית.
print_customer_detail_sku_and_quantity_bold_in_labelbool | nullאפשרות הדפסת תווית.
print_products_on_label_notesbool | nullאפשרות הדפסת תווית.
print_products_on_a4_label_notesbool | nullאפשרות הדפסת תווית.
print_products_namebool | nullאפשרות הדפסת תווית.
print_products_skubool | nullאפשרות הדפסת תווית.
print_virtual_product_on_notebool | nullאפשרות הדפסת תווית.
enable_codbool | nullהאם תשלום במזומן במסירה (COD) מופעל.
label_methodstring | nullשיטת יצירת התווית.
label_typestring | nullפורמט/סוג התווית.
separate_street_and_numberbool | nullאפשרות טיפול בכתובת.
get_street_number_with_suffixbool | nullאפשרות טיפול בכתובת.
display_shipping_line_numberbool | nullאפשרות תצוגה בתווית.
order_prefixstring | nullקידומת מספר הזמנה.
send_note_on_orderbool | nullהאם לשלוח הערה על ההזמנה.
created_atstringחותמת זמן בפורמט ISO 8601.
updated_atstringחותמת זמן בפורמט ISO 8601.

שגיאות

סטטוסקודמתי
401unauthenticatedפרטי הזדהות (client credentials) חסרים או שגויים.