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

# Find service points with the API

Use Service Points API v3 to find service points and integrate them into your own flow, whether a customer selects one or your system does.

This guide covers two parts of that flow: searching for service points and checking that a selected service point is still available before creating a shipment.

<Warning>
  Service Points API v3 does not support client-side authentication. It uses regular API credentials, which must not be
  exposed in client-side code. Call the API from your backend instead.
</Warning>

<Info>
  If you don't want to build and maintain your own service point selection interface, [integrate Sendcloud's hosted
  service point picker](/docs/service-points/integrate-the-hosted-service-point-picker-into-your-checkout) instead.
</Info>

## Configure carriers in your integration settings

If you plan to search using the carriers configured for your integration, enable service point delivery and the carriers you want to use:

1. In the Sendcloud platform, go to your [integration settings](https://app.sendcloud.com/v2/settings/integrations/manage)
2. Find your API integration and click **Configure**
3. Enable service point delivery
4. Enable the carriers you want to use for service point delivery and **save your changes**

<img src="https://mintcdn.com/sendcloud/bH_7gFwWAF2dSsyu/images/docs/service-points/enable-service-points-in-integration-settings.png?fit=max&auto=format&n=bH_7gFwWAF2dSsyu&q=85&s=29c6265e69eda263758ca13d99070dee" alt="Screenshot showing how to enable service points in the integration settings" width="914" height="1232" data-path="images/docs/service-points/enable-service-points-in-integration-settings.png" />

You can skip this step if you plan to provide carrier codes explicitly in the request.

## Search for service points

Use the [Retrieve a list of service points](/api/v3/service-points/retrieve-a-list-of-service-points) endpoint to find service points near a location.

A `country_code` is required. You also need to specify which carriers to search and provide the location to search around.

### Choose which carriers to search

* Set `use_integration_carriers=true` to use the carriers configured for your integration.
* Provide one or more `carrier_code` parameters to search specific carriers directly.

<Warning>
  These two options are mutually exclusive: use either `use_integration_carriers` or `carrier_code`, but not both.
</Warning>

If you use `use_integration_carriers`, make sure service points and the required carriers are configured as described in [Configure carriers in your integration settings](#configure-carriers-in-your-integration-settings).

Carriers provided with `carrier_code` do not need to be enabled in your integration settings.

### Provide a search location

You can search around an address or known coordinates.

Provide the full address in `address` or its individual parts using the `address_*` parameters. The API geocodes the address into a reference location and returns the closest matching service points first.

If you already know the location's coordinates, provide `latitude` and `longitude` instead.

<Warning>
  Only one reference point can be used per request: `address`, the `address_*` parameters, and `latitude`/`longitude`
  are mutually exclusive.
</Warning>

When using the structured address parameters, combine `address_house_number` with `address_street` or `address_postal_code`. A house number on its own is not specific enough to locate an address.

### Send the request

For example, to search around an address using the carriers configured for your integration:

```http Example request method and URL theme={null}
GET https://panel.sendcloud.sc/api/v3/service-points?country_code=NL&address=Stadhuisplein%2010%2C%20Eindhoven&use_integration_carriers=true
```

To search the same location using specific carriers instead:

```http Example request method and URL theme={null}
GET https://panel.sendcloud.sc/api/v3/service-points?country_code=NL&address=Stadhuisplein%2010%2C%20Eindhoven&carrier_code=postnl&carrier_code=dhl
```

See the [Retrieve a list of service points](/api/v3/service-points/retrieve-a-list-of-service-points) endpoint for all supported search parameters.

<Info>
  If you only need a few nearby service points, use `limit` to reduce the number of results returned. This reduces the
  response size and the amount of data your integration needs to process.
</Info>

### Handle the response

The closest matching service points are returned first:

```json Example response body theme={null}
{
  "data": {
    "results": [
      {
        "id": 1000001,
        "name": "Stadhuisplein Parcel Shop",
        "carrier": {
          "code": "postnl",
          "name": "PostNL",
          "logo_url": <...>,
          "icon_url": <...>
        },
        "carrier_service_point_id": "NL-00001",
        "address": {
          "street": "Stadhuisplein",
          "house_number": "1",
          "postal_code": "5611EM",
          "city": "Eindhoven",
          "country_code": "NL"
        },
        "position": {
          "latitude": 51.438022,
          "longitude": 5.478543
        },
        "opening_times": <...>,
        "is_open_tomorrow": true,
        "next_open_at": "2026-03-11T09:00:00+01:00",
        "is_expired": false,
        "distance": 85
      },
      <...>
    ],
    "geocoding": {
      "status": "matched",
      "precision": "house_number",
      "formatted_address": "Stadhuisplein 10, 5611 EM Eindhoven, Nederland"
    }
  }
}
```

When searching by address, check `data.geocoding` to see how the address was resolved:

* `status` tells you whether the address was matched, partially matched, or not found.
* `precision` indicates how precisely the location was resolved.
* `formatted_address` shows the address the search was based on.

A `partially_matched` result can still return service points, while `precision` indicates how closely the resolved location matches the address you provided.

Use the returned service points according to your flow. In a customer-facing flow, you can present them to the customer for selection. In an automated flow, your system can select one directly.
Whichever approach you use, keep the Sendcloud `id` of the selected service point. You'll need it to check availability and create the shipment.

#### No service points found

An empty `results` list does not necessarily mean the address could not be found.
When searching by address, check `data.geocoding.status` to distinguish between an address that was resolved successfully and one that could not be resolved.

If the status is `matched` or `partially_matched`, the location was resolved but no service points matched the search:

```json Example response - no matching service points theme={null}
{
  "data": {
    "results": [],
    "geocoding": {
      "status": "matched",
      "precision": "house_number",
      "formatted_address": "Stadhuisplein 10, 5611 EM Eindhoven, Nederland"
    }
  }
}
```

In this case, try making the search less restrictive. You can increase the `radius` or expand the bounding box, or remove these limits entirely to return the closest matching service points regardless of how far away they are.

If `data.geocoding.status` is `not_found`, the address itself could not be resolved:

```json Example response - address not found theme={null}
{
  "data": {
    "results": [],
    "geocoding": {
      "status": "not_found",
      "precision": null,
      "formatted_address": null
    }
  }
}
```

In a customer-facing flow, you can ask the customer to review the address and try again. In other flows, handle the unresolved address according to your integration's fallback logic.

## Check that a service point is still available

Service point availability can change over time. The search endpoint may return service points based on recently updated data, but that does not guarantee they are still available for delivery.

Before creating the shipment, check the selected service point using the [Check availability of a service point](/api/v3/service-points/check-availability-of-a-service-point) endpoint. The [hosted service point picker](/docs/service-points/integrate-the-hosted-service-point-picker-into-your-checkout) already checks availability when the customer makes their selection, but availability can change between checkout and fulfillment, so check again before you create the shipment.

Use the Sendcloud `id` of the selected service point:

```http Example request method and URL theme={null}
POST https://panel.sendcloud.sc/api/v3/service-points/1000001/check-availability
```

```json Example response body theme={null}
{
  "data": {
    "is_available": true
  }
}
```

How availability is determined depends on the carrier. For some carriers, this involves a live check with the carrier.
For others, the result is based on the best available information at the time of the request.

If `is_available` is `false`, do not continue with that service point. Your flow should select a different service point before creating the shipment.

## Next step

With an available service point selected, continue with creating the shipment.

<Card title="Create a shipment with service point delivery" href="/docs/service-points/create-a-shipment-with-service-point-delivery" icon="truck-fast" horizontal>
  Use the selected service point to find a compatible shipping option, then create and announce the shipment.
</Card>
