> ## Documentation Index
> Fetch the complete documentation index at: https://docs.nowshipping.co/llms.txt
> Use this file to discover all available pages before exploring further.

# Update a Scheduled Pickup — PUT /pickups/{pickupNumber}

> Update a pickup in 'new' or 'pendingPickup' status. Change any field you need — pickup fees are recomputed server-side on every successful update.

Use this endpoint to modify a pickup that has not yet been picked up by a courier. You can update the scheduled date, order count, contact phone, item flags, notes, and pickup address. Pickup fees are recomputed automatically on every successful update — you do not need to calculate or send them.

<Warning>
  Updates are only allowed while the pickup is in `new` or `pendingPickup` status. Past these states the pickup is locked and any modification attempt will return an error.
</Warning>

## Authentication

All requests require a valid API key. Company account keys must also include the `X-Merchant-Id` header.

```http theme={null}
Authorization: Bearer nsk_live_YOUR_KEY
X-Merchant-Id: shop_123
```

<Note>
  `X-Merchant-Id` accepts your `businessAccountCode` (8-digit), `externalMerchantId`, or MongoDB `_id`. Single-business keys do not require this header.
</Note>

## Path parameter

<ParamField path="pickupNumber" type="string" required>
  The 6-digit pickup number returned when the pickup was created (e.g. `482917`).
</ParamField>

## Request body

Send the same fields you would use when creating a pickup. Only include the fields you want to change — unset fields retain their current values.

<ParamField body="numberOfOrders" type="number">
  Updated expected order count. Triggers a fee recalculation.
</ParamField>

<ParamField body="pickupDate" type="string">
  New scheduled pickup date in `YYYY-MM-DD` format. Must be a valid future date per the Now Shipping pickup date policy.
</ParamField>

<ParamField body="phoneNumber" type="string">
  Updated courier contact phone number. Must be an 11-digit Egyptian mobile number.
</ParamField>

<ParamField body="isFragileItems" type="boolean">
  Set to `true` if any items are fragile. Defaults to `false`.
</ParamField>

<ParamField body="isLargeItems" type="boolean">
  Set to `true` if any items are large or oversized. Defaults to `false`.
</ParamField>

<ParamField body="pickupNotes" type="string">
  Updated free-text notes for the courier.
</ParamField>

<ParamField body="pickupLocation" type="string">
  Override the pickup location text displayed to the courier.
</ParamField>

<ParamField body="pickupAddressId" type="string">
  Change the linked merchant pickup address ID.
</ParamField>

## Example request

```bash theme={null}
curl -X PUT "https://now.com.eg/api/public/v1/pickups/482917" \
  -H "Authorization: Bearer nsk_live_YOUR_KEY" \
  -H "X-Merchant-Id: shop_123" \
  -H "Content-Type: application/json" \
  -d '{
    "numberOfOrders": 20,
    "pickupDate": "2026-07-29",
    "phoneNumber": "01012345678",
    "pickupNotes": "Updated notes"
  }'
```

## Response

A successful request returns HTTP `200` with the updated pickup object. The `pickupFees` field in the response reflects the newly recomputed fee.

<ResponseField name="success" type="boolean">
  `true` on success.
</ResponseField>

<ResponseField name="data.pickup" type="object">
  <Expandable title="pickup fields">
    <ResponseField name="pickupId" type="string">
      MongoDB `_id` of the pickup record.
    </ResponseField>

    <ResponseField name="pickupNumber" type="string">
      6-digit pickup number (unchanged).
    </ResponseField>

    <ResponseField name="pickupDate" type="string">
      Updated scheduled date.
    </ResponseField>

    <ResponseField name="picikupStatus" type="string">
      Current pickup status string. Note: the field name is `picikupStatus` as returned by the API.
    </ResponseField>

    <ResponseField name="pickupFees" type="number">
      Recomputed pickup fee in EGP reflecting the latest `numberOfOrders` and address configuration.
    </ResponseField>

    <ResponseField name="numberOfOrders" type="number">
      Updated expected order count.
    </ResponseField>

    <ResponseField name="updatedAt" type="string">
      ISO 8601 timestamp of this update.
    </ResponseField>
  </Expandable>
</ResponseField>

```json theme={null}
{
  "success": true,
  "data": {
    "pickup": {
      "pickupId": "66f1a2b3c4d5e6f7a8b9c0d3",
      "pickupNumber": "482917",
      "pickupDate": "2026-07-29",
      "picikupStatus": "new",
      "statusCategory": "new",
      "statusLabel": "New",
      "numberOfOrders": 20,
      "pickupFees": 60,
      "phoneNumber": "01012345678",
      "isFragileItems": false,
      "isLargeItems": false,
      "pickupNotes": "Updated notes",
      "createdAt": "2026-07-26T12:00:00.000Z",
      "updatedAt": "2026-07-26T14:30:00.000Z"
    }
  }
}
```

## Error responses

| HTTP status | Error code          | Description                                                   |
| ----------- | ------------------- | ------------------------------------------------------------- |
| `400`       | `VALIDATION_ERROR`  | Invalid field value (e.g. past date, missing required field). |
| `403`       | `FORBIDDEN`         | Pickup is no longer in an editable status.                    |
| `404`       | `NOT_FOUND`         | No pickup with this `pickupNumber` found under your account.  |
| `401`       | `UNAUTHORIZED`      | Missing or invalid API key.                                   |
| `403`       | `MERCHANT_REQUIRED` | Company key used without `X-Merchant-Id`.                     |

<Tip>
  If you need to check the current status of a pickup before attempting an update, call [`GET /pickups/{pickupNumber}`](/APIdoc/api/pickups/get) first. Only `new` and `pendingPickup` statuses allow modifications.
</Tip>
