跳转到主要内容
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