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

# Create a shipment with service point delivery

This guide explains how to create a shipment with service point delivery: find a compatible shipping option for the selected service point, then create and announce the shipment.

## Before you start

You need the Sendcloud `id` of the service point selected for the shipment. Some service points also require a post number.

If you haven't implemented service point selection yet, choose one of these approaches:

<CardGroup cols={2}>
  <Card title="Find service points with the API" href="/docs/service-points/find-service-points-with-the-api" icon="magnifying-glass">
    Use Service Points API v3 to find service points and integrate them into your own flow.
  </Card>

  <Card title="Integrate the hosted service point picker into your checkout" href="/docs/service-points/integrate-the-hosted-service-point-picker-into-your-checkout" icon="map-location-dot">
    Add Sendcloud's hosted picker and let customers choose a service point during checkout.
  </Card>
</CardGroup>

## Find a shipping option

Use the [Return a list of available shipping options](/api/v3/shipping-options/return-a-list-of-available-shipping-options) endpoint to find shipping options that can deliver to the selected service point.

Include the selected service point `id` as `to_service_point.id`, together with the shipment details that affect shipping option availability, such as the origin, destination, and parcel weight.

```http Example request method and URL theme={null}
POST https://panel.sendcloud.sc/api/v3/shipping-options
```

```json Example request body theme={null}
{
  "from_address": {
    "country_code": "NL",
    "postal_code": "1000AA",
    "city": "Amsterdam"
  },
  "to_address": {
    "country_code": "NL",
    "postal_code": "5611EM",
    "city": "Eindhoven"
  },
  "to_service_point": {
    "id": "1000001"
  },
  "parcels": [
    {
      "weight": {
        "value": "1.500",
        "unit": "kg"
      }
    }
  ]
}
```

The response contains the shipping options available for the shipment and selected service point:

```json Example response body theme={null}
{
  "data": [
    {
      "code": "postnl:pakjegemak",
      "name": "PostNL service point",
      "carrier": {
        "code": "postnl",
        "name": "PostNL"
      },
      <...>
    }
  ]
}
```

Choose one of the returned shipping options and keep its code. We'll use `postnl:pakjegemak` when creating the shipment in the next section.

See [Shipping options & quotes](/docs/shipments/shipping-options-and-quotes) for more on filtering options, calculating quotes, and shipping functionalities.

### Find shipping options before selecting a service point

Some flows retrieve available delivery options before a service point has been selected. In this case, omit `to_service_point` and filter shipping options using `functionalities.last_mile` instead.

For example, to find shipping options that support service point delivery:

```json Example request body theme={null}
{
  "from_address": {
    "country_code": "NL",
    "postal_code": "1000AA",
    "city": "Amsterdam"
  },
  "to_address": {
    "country_code": "NL",
    "postal_code": "5611EM",
    "city": "Eindhoven"
  },
  "functionalities": {
    "last_mile": "service_point"
  },
  "parcels": [
    {
      "weight": {
        "value": "1.500",
        "unit": "kg"
      }
    }
  ]
}
```

This returns shipping options that support service point delivery without restricting the request to a specific service point.

<Info>
  `service_point` is one of the supported `last_mile` values. Other values can be used for different delivery types,
  including locker delivery and options that support either lockers or service points. See the [Shipping Options API
  reference](/api/v3/shipping-options/return-a-list-of-available-shipping-options) for the available `last_mile` values.
</Info>

## Create and announce the shipment

Use the [Create and announce a shipment synchronously](/api/v3/shipments/create-and-announce-a-shipment-synchronously) endpoint to create and announce the shipment.

Include the selected service point `id` in `to_service_point.id` and the shipping option `code` from [Find a shipping option](#find-a-shipping-option) in `ship_with.properties.shipping_option_code`.

```http Example request method and URL theme={null}
POST https://panel.sendcloud.sc/api/v3/shipments/announce
```

```json Example request body theme={null}
{
  "to_address": {
    "name": "John Doe",
    "address_line_1": "Stadhuisplein",
    "house_number": "10",
    "postal_code": "5611EM",
    "city": "Eindhoven",
    "country_code": "NL",
    "email": "john.doe@example.com"
  },
  "from_address": {
    "sender_address_id": 42
  },
  "to_service_point": {
    "id": "1000001"
  },
  "ship_with": {
    "type": "shipping_option_code",
    "properties": {
      "shipping_option_code": "postnl:pakjegemak"
    }
  },
  "parcels": [
    {
      "weight": {
        "value": "1.500",
        "unit": "kg"
      }
    }
  ]
}
```

Some service points require a post number in addition to the service point `id`, such as a DHL PackStation. When a post number is required, pass it as `to_address.po_box`.

The [hosted service point picker](/docs/service-points/integrate-the-hosted-service-point-picker-into-your-checkout) collects and returns the post number when needed.
If you implement [your own selection flow with Service Points API v3](/docs/service-points/find-service-points-with-the-api), your integration needs to determine when a post number is required and obtain it separately.

The response includes the created shipment, the service point it will be delivered to, and a link to the label:

```json Example response body theme={null}
{
  "data": {
    "id": "facade00-0000-4000-a000-000000000000",
    "ship_with": {
      "type": "shipping_option_code",
      "properties": {
        "shipping_option_code": "postnl:pakjegemak",
        "contract_id": 101
      }
    },
    "to_service_point": {
      "id": "1000001",
      "carrier_service_point_id": "12345"
    },
    "carrier": {
      "code": "postnl",
      "name": "PostNL"
    },
    <...>
  }
}
```

See [Create a shipment](/docs/shipments/create-a-shipment) for the full request schema, error handling, and advanced options such as customs and insurance.
