> [!NOTE]
> **Note:** **Before constructing a vehicle request** , read the requirements under [Vehicle requests](https://developers.google.com/maps/documentation/mobility/fleet-engine/essentials/vehicles.md.txt#vehicle_requests) in the Introduction.

This document describes how to list delivery vehicles.

## Environments and limitations

You can list delivery vehicles from a server or browser environment. The Driver
SDK does not support listing delivery vehicles.

Listing delivery vehicles requests broad access to delivery vehicles and is
intended only for trusted users. Use *Delivery Fleet Reader* or *Fleet Engine
Delivery Admin* tokens when making list delivery vehicles requests.

Listed delivery vehicles have the following fields redacted due to their impact
on response size:

- `CurrentRouteSegment`
- `RemainingVehicleJourneySegments`

## Usage

You can list vehicles by attribute filters and viewport bounds. If you specify
no filter or viewport, the response includes all delivery vehicles.

### List with attributes filters

You can list delivery vehicles by filter using their `attributes` property. For
example, to query an attribute with key `my_key` and value `my_value`, use
`attributes.my_key = my_value`. To query for multiple attributes, join queries
using the logical `AND` and `OR` operators as in `attributes.key1 = value1 AND
attributes.key2 = value2`. See [AIP-160](https://google.aip.dev/160) for a full description
of filter query syntax. If you combine filters with viewport bounds, the filter
acts as an `AND` operator to the viewport bound. See [Vehicle attributes filter
queries](https://developers.google.com/maps/documentation/mobility/fleet-engine/essentials/vehicles/scheduled-tasks-vehicle-fields) for details.

### List with viewport bounds

You can filter listed delivery vehicles by location using the `viewport` request
parameter. The `viewport` request parameter defines viewports using two bounding
coordinates: a `high` (northeast) and `low` (southwest) latitude and longitude
coordinates pair. Requests are rejected if they contain a high latitude
that is geographically lower than a low latitude.

### List responses

Delivery vehicle lists are paginated by default using a reasonable page size. If
you specify a page size, the request returns only the number of vehicles
specified by the limit, or fewer. If the requested page size exceeds an internal
maximum value, then the internal maximum is used. The default and maximum page
sizes are both 100 vehicles.

A delivery vehicles list can include a token for reading the next page of
results. A page token is only present in a response when more pages of delivery
vehicles are available for retrieval. To retrieve the next page of tasks, use
the page token with a request that is otherwise identical to the previous
request.

## List vehicles examples

You can use the [Java gRPC library](https://developers.google.com/maps/documentation/mobility/fleet-engine/essentials/client-libraries-tasks.md.txt#java) or REST to list delivery vehicles in a
particular region with a certain attribute. A successful response can still be
empty. When that happens, it means that no vehicles with the specified attribute
exist in the specified viewport. For a complete list of supported languages, see
[Client libraries for scheduled task services](https://developers.google.com/maps/documentation/mobility/fleet-engine/essentials/client-libraries-tasks.md.txt).

### Java

```java

  static final String PROJECT_ID = "my-delivery-co-gcp-project";

  DeliveryServiceBlockingStub deliveryService =
    DeliveryServiceGrpc.newBlockingStub(channel);

  // Tasks request
  String parent = "providers/" + PROJECT_ID;
  ListDeliveryVehiclesRequest listDeliveryVehiclesRequest =
    ListDeliveryVehiclesRequest.newBuilder()  // No need for the header
        .setParent(parent)
        .setViewport(
              Viewport.newBuilder()
                .setHigh(LatLng.newBuilder()
                    .setLatitude(37.45)
                    .setLongitude(-122.06)
                    .build())
                .setLow(LatLng.newBuilder()
                    .setLatitude(37.41)
                    .setLongitude(-122.11)
                    .build())
        .setFilter("attributes.my_key = my_value")
        .build();

  try {
    ListDeliveryVehiclesResponse listDeliveryVehiclesResponse =
        deliveryService.listDeliveryVehicles(listDeliveryVehiclesRequest);
  } catch (StatusRuntimeException e) {
    Status s = e.getStatus();
    switch (s.getCode()) {
        case NOT_FOUND:
            break;

        case PERMISSION_DENIED:
            break;
    }
    return;
  }
```

### REST

```s
  # HTTP request
  html GET https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles
```

```s

  # Request with a filter
  # Request sets JWT, PROJECT_ID, and VEHICLE_ID in the local environment
  curl -H "Authorization: Bearer ${JWT}" \
    "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/deliveryVehicles?filter=attributes.my_key%20%3D%20my_value%20&viewport.high.latitude=37.45&viewport.high.longitude=-122.06&viewport.low.latitude=37.41&viewport.low.longitude=-122.11"
```

If the lookup is successful, the response body contains data with the following
structure:

```json
  // JSON representation
  {
    "deliveryVehicles": [
      {
        object (DeliveryVehicle)
      }
    ],
    "nextPageToken": string,
    "totalSize": integer
  }

```

## What's next

- [Delete Delivery Vehicle](https://developers.google.com/maps/documentation/mobility/fleet-engine/essentials/vehicles/scheduled-tasks-delete-vehicle.md.txt)