跳轉到主要內容
GET
/
api
/
ReturnInventory
/
list
List return inventories with pagination
curl --request GET \
  --url https://api.returnshelper.com/uat/user/api/ReturnInventory/list \
  --header 'x-rr-apikey: <api-key>' \
  --header 'x-rr-apitoken: <api-key>'
{
  "data": [
    {
      "returnInventoryId": 123,
      "returnRequestId": 123,
      "returnRequestLineItemId": "<string>",
      "rma": "<string>",
      "itemRma": "<string>",
      "sku": "<string>",
      "handlingCode": "<string>",
      "handlingStatusCode": "<string>",
      "warehouseId": 123,
      "createOn": "2023-11-07T05:31:56Z"
    }
  ],
  "totalNumberOfRecords": 123
}
本端點是追蹤退件庫存狀態的建議方式。Return Helper API 中庫存生命週期的真實資料來源是 Webhook 事件流——markShipmentArrivenewInventoryCreatedvasUpdated、庫存處理完成事件、notifyUserRmaSwapped 等會在狀態變更時即時推送至您的端點。請圍繞 webhook 設計整合;本列表端點僅用於一次性回填與營運對帳。
回傳退件庫存紀錄的分頁列表——即倉庫側的逐項狀態。每筆紀錄代表一件已收到的物品,包含目前的處理決定、RMA、SKU 對映與所屬倉庫。

僅在以下情況呼叫

  • 一次性回填:首次整合時,於訂閱 webhook 之前,將既有庫存寫入本地資料庫。
  • 定期對帳:用以偵測遺漏或亂序的 webhook 傳遞——將本地快取與本端點結果比對。
至於持續性狀態——例如包裹被登記、處理完成、RMA 被重派——請訂閱 webhook。輪詢本端點以察覺狀態變更不受支援,且在高負載下會產生過期資料。

必要參數

  • createFrom / createTo — 均必填,ISO 8601 時間戳。範圍上限為 62 天SearchConfig.simpleRecordsMaxDays),超出會傳回軟錯誤。實際語義請見下方的 視窗語義
  • pageSize — 介於 150 之間。
  • offset — 非負整數。搭配 pageSize 用於位移分頁。

回應備註

  • totalNumberOfRecords(頂層欄位,與 data 同層)為目前視窗的總筆數——分頁時以此作為上限。
  • handlingCode 反映目前的處理決定——可呼叫 更新退件庫存處理 變更。
  • handlingStatusCode 反映該處理決定的工作流狀態;可透過 取得所有處理狀態 轉譯。
  • 物品的 RMA(rma)是倉庫指派的識別碼,並非您賣家端的參考號。

歷史庫存回填

可用本端點將每一筆既有的退件庫存載入您的本地資料庫,之後一律改用 webhook 接收後續事件。由於 API 對每次請求的時間範圍上限為 62 天,整體流程是「以 62 天為一格的滑動視窗,每格視窗內分頁、視窗依序往前推」,直至覆蓋帳號開通日。

視窗語義

開始撰寫迴圈前,請先理解以下兩條規則——這是「乾淨回填」與「靜默漏一天」之間的分界線。
  1. 驗證器規則(日曆日差):
    createTo.Date − createFrom.Date  ≤  62
    
    比較前會先把兩端的時分秒歸零。所以 createFrom = 2024-03-13T15:00:00ZcreateTo = 2024-05-14T09:00:00Z 的請求仍然有效(May 14 − Mar 13 = 62 天),即使實際牆鐘時長略短於 62 × 24 小時。
  2. 資料過濾(兩端整日皆包含):
    createOn ≥ createFrom.BeginOfDay()   AND   createOn ≤ createTo.EndOfDay()
    
    也就是說,伺服器會把 createFrom 擴張到當日 00:00:00.000createTo 擴張到當日 23:59:59.999,再進行過濾。因此一次合法請求實際覆蓋 63 個連續日曆日的資料(createFrom 當日整天、createTo 當日整天、以及之間所有天)。
對滑動視窗回填的實際影響:若把視窗 N 的 createFrom 直接作為視窗 N+1 的 createTo,那一天會同時出現在兩個視窗的結果中。這是重複,不是漏單——演算法絕不會漏單,只是在每個視窗接縫處多抓約一天的資料。只要本地資料表以 returnInventoryId 作為主鍵並使用 UPSERT(或 INSERT IGNORE),重複自動合併,最終資料完全正確。 如要徹底避免重複抓取,每次迭代後改成 windowEnd = windowStart − 1 day(而非 windowEnd = windowStart),每個視窗就是無重疊的全新 63 天切片。兩種寫法都正確;下方範例採用「容許接縫重疊」版本,因為它對客戶端與伺服器之間的時鐘漂移更寬容,是建議的預設。

回填演算法

  1. 選定 historyStart(例如帳號開通日)。
  2. windowEnd = now() 起步。
  3. 計算 windowStart = max(windowEnd − 62 天, historyStart)
  4. 在視窗內,從 offset = 0 開始按 pageSize 翻頁,直到 offset ≥ totalNumberOfRecords。每筆紀錄以 returnInventoryId 為主鍵 UPSERT 進入本地資料庫。
  5. windowEnd = windowStart,回到第 3 步繼續,直至 windowEnd ≤ historyStart
  6. 之後改由 newInventoryCreated webhook(以及其他庫存生命週期事件)維護本地資料;除非懷疑 webhook 資料遺失,否則無須重跑本回填。

程式範例

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Instant;
import java.time.temporal.ChronoUnit;

// Requires a JSON library on the classpath. Below uses org.json for brevity:
//   <dependency><groupId>org.json</groupId><artifactId>json</artifactId></dependency>
import org.json.JSONArray;
import org.json.JSONObject;

class Main {
  static final String BASE_URL  = "https://api.returnhelpercentre.com/v1/user"; // production
  // sandbox: "https://api.returnshelper.com/uat/user"
  static final String API_KEY   = "<your api key>";
  static final String API_TOKEN = "<your api token>";

  static final int PAGE_SIZE   = 50;
  static final int WINDOW_DAYS = 62; // server cap: createTo.Date - createFrom.Date <= 62

  public static void main(String[] args) throws Exception {
    Instant historyStart = Instant.parse("2024-01-01T00:00:00Z"); // backfill anchor
    Instant windowEnd    = Instant.now();                         // walk backwards from now

    HttpClient http = HttpClient.newHttpClient();

    while (windowEnd.isAfter(historyStart)) {
      Instant windowStart = windowEnd.minus(WINDOW_DAYS, ChronoUnit.DAYS);
      if (windowStart.isBefore(historyStart)) {
        windowStart = historyStart;
      }

      int offset = 0;
      int total  = Integer.MAX_VALUE;

      while (offset < total) {
        String url = BASE_URL + "/api/ReturnInventory/list"
                   + "?pageSize="   + PAGE_SIZE
                   + "&offset="     + offset
                   + "&createFrom=" + windowStart
                   + "&createTo="   + windowEnd;

        HttpRequest req = HttpRequest.newBuilder()
            .uri(URI.create(url))
            .header("x-rr-apikey",   API_KEY)
            .header("x-rr-apitoken", API_TOKEN)
            .header("Accept",        "application/json")
            .GET()
            .build();

        HttpResponse<String> resp = http.send(req, HttpResponse.BodyHandlers.ofString());
        JSONObject body = new JSONObject(resp.body());

        // Standard envelope: business status is in meta.status, not HTTP status.
        JSONObject meta = body.optJSONObject("meta");
        if (meta == null || meta.optInt("status") != 200) {
          System.err.println("list call failed: " + (meta == null ? "no meta" : meta.toString()));
          return;
        }

        total = body.optInt("totalNumberOfRecords", 0);
        JSONArray rows = body.optJSONArray("data");
        if (rows != null) {
          for (int i = 0; i < rows.length(); i++) {
            JSONObject inv = rows.getJSONObject(i);
            // TODO: UPSERT into your DB with returnInventoryId as primary key.
            //       Adjacent windows share a seam day, so the same row may be
            //       returned twice; UPSERT absorbs the duplicate.
            //   inv.getLong("returnInventoryId")
            //   inv.getString("handlingCode")
            //   inv.getString("handlingStatusCode")
            //   inv.getInt("warehouseId")
          }
        }

        offset += PAGE_SIZE;
        Thread.sleep(200); // light throttle
      }

      windowEnd = windowStart;
    }
  }
}
如需了解錯誤回應的解讀與處理方式,請參閱 Error codes

授權

x-rr-apikey
string
header
必填

Your API key

x-rr-apitoken
string
header
必填

Your API token — keep this private

查詢參數

pageSize
integer
必填

Number of records per page (1–50)

必填範圍: 1 <= x <= 50
offset
integer
必填
createFrom
string<date-time>
必填
createTo
string<date-time>
必填

回應

Success

data
object[]

List of return inventories

totalNumberOfRecords
integer<int32>

Total count of return inventories