Skip to main content
GET
/
packages
List packages
curl --request GET \
  --url https://api.arcuserp.com/v1/packages \
  --header 'Authorization: Bearer <token>'
import requests

url = "https://api.arcuserp.com/v1/packages"

headers = {"Authorization": "Bearer <token>"}

response = requests.get(url, headers=headers)

print(response.text)
const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};

fetch('https://api.arcuserp.com/v1/packages', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));
<?php

$curl = curl_init();

curl_setopt_array($curl, [
CURLOPT_URL => "https://api.arcuserp.com/v1/packages",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
package main

import (
"fmt"
"net/http"
"io"
)

func main() {

url := "https://api.arcuserp.com/v1/packages"

req, _ := http.NewRequest("GET", url, nil)

req.Header.Add("Authorization", "Bearer <token>")

res, _ := http.DefaultClient.Do(req)

defer res.Body.Close()
body, _ := io.ReadAll(res.Body)

fmt.Println(string(body))

}
HttpResponse<String> response = Unirest.get("https://api.arcuserp.com/v1/packages")
.header("Authorization", "Bearer <token>")
.asString();
require 'uri'
require 'net/http'

url = URI("https://api.arcuserp.com/v1/packages")

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

request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'

response = http.request(request)
puts response.read_body
{
  "object": "list",
  "data": [
    {
      "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
      "object": "package",
      "entity_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
      "order_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
      "package_number": "<string>",
      "weight_lb": 123,
      "length_in": 123,
      "width_in": 123,
      "height_in": 123,
      "carrier": "<string>",
      "service_level": "<string>",
      "tracking_number": "<string>",
      "tracking_url": "<string>",
      "ship_cost": 123,
      "billed_ship_cost": 123,
      "location_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
      "insurance_amount_override": 123,
      "insurance": {
        "active": true,
        "bought": true,
        "amount": 123,
        "currency": "<string>",
        "fee_estimate": 123,
        "provider": "<string>",
        "covered_items": [
          "<string>"
        ],
        "covered_item_count": 123
      },
      "shipped_at": "2023-11-07T05:31:56Z",
      "delivered_at": "2023-11-07T05:31:56Z",
      "metadata": {},
      "created_at": "2023-11-07T05:31:56Z",
      "updated_at": "2023-11-07T05:31:56Z"
    }
  ],
  "has_more": true
}
{
"error": "not_found",
"code": "not_found",
"type": "not_found",
"hint": "The requested order does not exist or does not belong to this entity.",
"param": "expand[0]",
"required": "accounts:read",
"request_id": "req_abc123"
}
{
"error": "not_found",
"code": "not_found",
"type": "not_found",
"hint": "The requested order does not exist or does not belong to this entity.",
"param": "expand[0]",
"required": "accounts:read",
"request_id": "req_abc123"
}

Authorizations

Authorization
string
header
required

API key issued per entity via Settings > Developers > API Keys. Each key carries scopes (e.g. orders:read, products:write). Bearer token format: Authorization: Bearer ark_live_ent_Test keys use ark_test_ent_. Both are issued per entity
via Settings > Developers > API Keys.

Query Parameters

order_id
string<uuid>
status
enum<string>
Available options:
open,
fulfilled,
voided
location_id
string<uuid>

Filter to a single warehouse location (Layer 4 isolation). Resolved from the X-Location-Id request header first, then this query param. Packages inherit location from their order (packages.order_id -> orders.location_id); packages whose order has NULL location_id remain visible at every location (NULL-universal).

exclude_empty
boolean
default:false

When true, draft packages with zero items are excluded from the response. Useful for operator queues that should never show orphan packages while still allowing audit workflows to fetch them with the default false. Default: false (backwards-compat; every existing caller continues to receive empty drafts). Added 2026-05-16 per NEW-GAP-WH-ORPHAN-EMPTY-DRAFT-PACKAGES-LITTER-FULFILLMENT-STATION.

limit
integer
default:25

Maximum number of records to return per page. Default 25, max 500. Use together with starting_after for cursor pagination. For larger bulk extraction workflows prefer the migration endpoints.

Required range: 1 <= x <= 500
starting_after
string

Cursor for pagination. Pass the id of the last record from the previous page to fetch the next page. Mutually exclusive with ending_before.

Maximum string length: 200
expand[]
enum<string>[]
Available options:
data.items,
data.items.product,
data.label,
data.tracking_events,
data.order

Response

Paginated package list

object
enum<string>
Available options:
list
data
object[]
has_more
boolean