# Delivery Again

> Request re-delivery for one or more orders that are at a GHN warehouse or awaiting return. The order must already be in a re-deliverable status — see `order_codes` below.

## Endpoint

| Environment | URL |
| --- | --- |
| Production | `https://online-gateway.ghn.vn/shiip/public-api/v2/switch-status/storing` |
| Staging | `https://dev-online-gateway.ghn.vn/shiip/public-api/v2/switch-status/storing` |

**Method**: `POST`

## Headers

| Header | Required | Description |
| --- | --- | --- |
| `Content-Type` | Yes | `application/json` |
| `Token` | Yes | Shop token (issued by GHN) — [get a token](https://developer.ghn.vn/en/docs/token/get-token.md) |
| `ShopId` | Yes | Shop ID (int) |

## Parameters

- **order_codes** (String[]): GHN tracking codes to request re-delivery for, in one batch. Each order must currently be in status `storing` or `waiting_to_return`; any other status comes back as `result: false` (see Response). Processed **per order** (best-effort), not all-or-nothing

## Request Example

```bash
curl -X POST https://dev-online-gateway.ghn.vn/shiip/public-api/v2/switch-status/storing \
  -H "Token: 5c1d8a9e-2f4b-11ed-..." \
  -H "ShopId: 92837" \
  -H "Content-Type: application/json" \
  -d '{
    "order_codes": ["LADHUX", "LADFYR"]
  }'
```

## Response

### Result (HTTP 200)

**Best-effort per order**: each code is processed independently, so the response is always HTTP 200 with one entry per code — even if every code fails. **Always inspect each entry's `result`**; HTTP 200 does not mean every order was accepted.

```json
{
  "code": 200,
  "message": "Success",
  "data": [
    {
      "order_code": "LADHUX",
      "result": false,
      "message": "Trạng thái đơn hàng không hợp lệ"
    },
    {
      "order_code": "NOTREAL9",
      "result": false,
      "message": "Order code không tồn tại."
    }
  ]
}
```

A successful entry has `result: true` and `message: "OK"`.

### Response Fields

| Field | Type | Description |
| --- | --- | --- |
| `code` | Int | HTTP code (`200` on success) |
| `message` | String | Top-level result message (`Success`) |
| `data` | Object[] | One entry per order code in the request |
| `data[].order_code` | String | The order this entry refers to |
| `data[].result` | Bool | `true` if re-delivery was accepted; `false` if the order was rejected |
| `data[].message` | String | Per-order message. `OK` on success; on failure one of:<br>`Trạng thái đơn hàng không hợp lệ` — order status is not re-deliverable<br>`Order code không tồn tại.` — unknown order code<br>`Khách hàng không có quyền thay đổi trạng thái đơn hàng.` — order does not belong to your account |

## Error Codes

| Condition | HTTP | Meaning |
| --- | --- | --- |
| `result: false` in `data` | 200 | Per-order failure — check the entry's `message` (status not re-deliverable / unknown code / not your order) |
| `CLIENT_NOT_OWNER_OF_SHOP` | 400 | Token does not own the shop |
| `SERVER_ERROR_COMMON` | 500 | Internal error |
