# PUT /api/orders/{unique_key}/shipping

注文配送先更新

指定した注文の配送先を設定します。

配送先の氏名、郵便番号、都道府県または州、住所、電話番号を設定できます。
ただし、配送先の国は変更できません。
郵便番号や電話番号は配送先の国に応じて検証し、住所の組み合わせや注文状態により変更できない場合は `422` を返します。

更新すると、ショップおよび購入者へお届け先の変更を知らせるメールを送信します。

更新後の配送先を取得できた場合は `200`、更新は成功したものの配送先を取得できない場合は `204` を返します。
`204` の場合は同じリクエストを再送しないでください。
`5xx` の場合は更新の成否を確定できないため、再送せずに `GET /api/orders/{unique_key}` で状態を確認してください。

## 要求スコープ

- `orders.read`
- `orders.update`

## パラメータ

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `unique_key` | path | `OrderUniqueKey` | 必須 | 注文の一意キー（16 桁の半角英数字）。小文字は大文字として扱います。 |

## リクエストボディ

`application/json`

- `name` OrderShippingUpdateName（必須）
  - `first` string（必須 / 1 文字以上 / 255 文字以下）: 配送先の名（1〜255 文字）
  - `last` string（必須 / 1 文字以上 / 255 文字以下）: 配送先の姓（1〜255 文字）
- `address` OrderShippingUpdateAddress（必須）
  - `zip_code` string（必須 / 1 文字以上 / 10 文字以下）: 配送先の郵便番号（1〜10 文字）
  - `prefecture` string（必須 / 1 文字以上 / 40 文字以下）: 配送先の都道府県または州（1〜40 文字）
  - `address` string（必須 / 1 文字以上 / 255 文字以下）: 配送先の市区町村・番地（1〜255 文字）
  - `address2` string（必須 / 1 文字以上 / 255 文字以下）: 配送先の建物名・部屋番号など（1〜255 文字）
  - `tel` string（必須 / 1 文字以上 / 15 文字以下 / pattern: ^\+?\d+$）: 配送先の電話番号（15 文字以内）。数字のみ、または先頭に + を付けた番号を指定できます。

## レスポンスボディ（200）

`application/json`

- `name` OrderShippingName（必須）
  - `first` string | null（必須）: 名。配送先未登録時は null です。
  - `last` string | null（必須）: 姓。配送先未登録時は null です。
- `address` OrderShippingAddress（必須）
  - `country` string | null（必須）: 国名。配送先未登録時は null です。
  - `country_code` string | null（必須）: 国コード（ISO 3166-1 alpha-2）。未登録または国コードを特定できない場合は null です。
  - `zip_code` string | null（必須）: 郵便番号。配送先未登録時は null です。
  - `prefecture` string | null（必須）: 都道府県。配送先未登録時は null です。
  - `address` string | null（必須）: 市区町村・番地。配送先未登録時は null です。
  - `address2` string | null（必須）: 建物名・部屋番号など。配送先未登録時は null です。
  - `tel` string | null（必須）: 電話番号。未登録時は null です。

## リクエスト例

```sh
curl -X PUT "https://apiv2.thebase.com/api/orders/<unique_key>/shipping" \
  -H "Authorization: Bearer <your-token>" \
  -H "Content-Type: application/json" \
  -d '{
  "name": {
    "first": "太郎",
    "last": "山田"
  },
  "address": {
    "zip_code": "0000000",
    "prefecture": "東京都",
    "address": "サンプル市1-2-3",
    "address2": "サンプルビル101",
    "tel": "0000000000"
  }
}'
```

## レスポンス

| Status | Description |
| --- | --- |
| `200` | 更新成功。更新後の配送先を返します。 |
| `204` | 更新成功。更新後の配送先を取得できないため、レスポンス本文は返しません。 |

## エラー

エラーは `application/problem+json` の Problem 形式で返します。認証・スコープ・予期しない内部エラーなど、すべてのエンドポイントに共通のエラーと構造・判別方法は [エラーレスポンス](/docs/errors.md) を参照してください。

このエンドポイントが返すその他のエラーは次のとおりです。

| Status | Type | Description |
| --- | --- | --- |
| `400` | `/errors/request/malformed-body` | リクエストボディをこのエンドポイントが要求する形式として解釈できない場合に返します。 |
| `400` | `/errors/orders/invalid-body` | リクエストボディがエンドポイントのスキーマを満たさない場合に返します。 |
| `400` | `/errors/request/invalid-params` | 1 つ以上のパスパラメータがエンドポイントのスキーマを満たさない場合に返します。 |
| `404` | `/errors/orders/not-found` | 指定した注文が存在しない、または呼び出し元から参照できない場合に返します。 |
| `413` | `/errors/request/body-too-large` | JSON リクエストボディが 1 MiB の上限を超える場合に返します。 |
| `415` | `/errors/request/unsupported-media-type` | JSON 形式のリクエストボディを要求するエンドポイントに、対応していない Content-Type が指定された、または Content-Type が指定されていない場合に返します。 |
| `422` | `/errors/orders/update-rejected` | 注文状態、決済手段、指定値、更新回数などの業務ルールにより、注文内容、メールアドレス、配送先、配送希望日時、またはショップメモを更新できない場合に返します。 |
| `502` | `/errors/internal/bad-gateway` | BASE API が処理を完了するために必要な内部処理で不整合が発生した場合に返します。 |
| `504` | `/errors/internal/gateway-timeout` | BASE API が処理を完了するために必要な内部処理が制限時間内に完了しなかった場合に返します。 |

