> ## Documentation Index
> Fetch the complete documentation index at: https://run-deliverys.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Quote cost

> Get a Local delivery quote for one shipment.

Get a Local delivery quote for one shipment.

Requires scope: `orders:write`

## Headers

<ParamField header="Authorization" type="string" required>
  Bearer API key (`Bearer <api_key>`).
</ParamField>

## Body

<ParamField body="pickup_address" type="string" required>
  Full pickup address (≥ 3 chars).
</ParamField>

<ParamField body="dropoff_address" type="string" required>
  Full drop-off address (≥ 3 chars).
</ParamField>

<ParamField body="weight" type="number" required>
  Billable weight in kg (≥ 0.1). For `vehicle_type=bike`, weight also selects the rate-card band.
</ParamField>

<ParamField body="vehicle_type" type="string">
  `bike`, `bus_van`, or `truck`. When set, quotes use your business [rate card](/orders/rate-cards). Omit for distance-only pricing.
</ParamField>

<ParamField body="option_id" type="string">
  Option id from [Rate cards](/orders/rate-cards). Required for `bus_van` and `truck`. Omit for bike (band from weight).
</ParamField>

<ParamField body="pickup_lat" type="number">
  Optional pickup latitude.
</ParamField>

<ParamField body="pickup_lng" type="number">
  Optional pickup longitude.
</ParamField>

<ParamField body="dropoff_lat" type="number">
  Optional drop-off latitude.
</ParamField>

<ParamField body="dropoff_lng" type="number">
  Optional drop-off longitude. If all four lat/lng are set, geocode is skipped.
</ParamField>

## Response

<ResponseField name="price" type="number">
  Quoted price.
</ResponseField>

<ResponseField name="distance_km" type="number">
  Estimated distance in km.
</ResponseField>

<ResponseField name="currency" type="string">
  Currency code (for example `NGN`).
</ResponseField>

<ResponseField name="pricing_model" type="string">
  `rate_card` or `distance`.
</ResponseField>

<ResponseField name="option_id" type="string">
  Resolved option id (for example the bike weight band).
</ResponseField>

<ResponseField name="option_label" type="string">
  Snapshot label for the option.
</ResponseField>

<ResponseField name="delivery_mode" type="string">
  Assignment mode (for example `MOTORBIKE`, `BUS_VAN`, `TRUCK`).
</ResponseField>

<ResponseField name="from_zone_name" type="string">
  Resolved from-zone name when rate-card quoting applies.
</ResponseField>

<ResponseField name="to_zone_name" type="string">
  Resolved to-zone name when rate-card quoting applies.
</ResponseField>

<Tip>
  Prefer [listing options](/orders/rate-cards) RUN already configured for you, then quote with `vehicle_type`. See [Rate-card pricing](/guides/rate-card-pricing).
</Tip>

<RequestExample>
  ```bash cURL theme={null}
  curl -X POST "$RUN_BASE_URL/business/order/cost" \
    -H "Authorization: Bearer $RUN_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "pickup_address": "15 Bode Thomas Street, Surulere, Lagos",
      "dropoff_address": "24 Allen Avenue, Ikeja, Lagos",
      "weight": 2,
      "vehicle_type": "bike"
    }'
  ```

  ```javascript Node.js theme={null}
  const res = await fetch(`${process.env.RUN_BASE_URL}/business/order/cost`, {
    method: 'POST',
    headers: {
      Authorization: `Bearer ${process.env.RUN_API_KEY}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      pickup_address: '15 Bode Thomas Street, Surulere, Lagos',
      dropoff_address: '24 Allen Avenue, Ikeja, Lagos',
      weight: 2,
      vehicle_type: 'bike',
    }),
  });
  const quote = await res.json();
  ```

  ```python Python theme={null}
  import os
  import requests

  res = requests.post(
      f"{os.environ['RUN_BASE_URL']}/business/order/cost",
      headers={
          "Authorization": f"Bearer {os.environ['RUN_API_KEY']}",
          "Content-Type": "application/json",
      },
      json={
          "pickup_address": "15 Bode Thomas Street, Surulere, Lagos",
          "dropoff_address": "24 Allen Avenue, Ikeja, Lagos",
          "weight": 2,
          "vehicle_type": "bike",
      },
  )
  quote = res.json()
  ```

  ```php PHP theme={null}
  <?php
  $ch = curl_init(getenv('RUN_BASE_URL') . '/business/order/cost');
  curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_HTTPHEADER => [
      'Authorization: Bearer ' . getenv('RUN_API_KEY'),
      'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
      'pickup_address' => '15 Bode Thomas Street, Surulere, Lagos',
      'dropoff_address' => '24 Allen Avenue, Ikeja, Lagos',
      'weight' => 2,
      'vehicle_type' => 'bike',
    ]),
  ]);
  $quote = json_decode(curl_exec($ch), true);
  curl_close($ch);
  ```

  ```go Go theme={null}
  package main

  import (
    "bytes"
    "fmt"
    "io"
    "net/http"
    "os"
  )

  func main() {
    body := []byte(`{
      "pickup_address": "15 Bode Thomas Street, Surulere, Lagos",
      "dropoff_address": "24 Allen Avenue, Ikeja, Lagos",
      "weight": 2,
      "vehicle_type": "bike"
    }`)
    req, _ := http.NewRequest(
      "POST",
      os.Getenv("RUN_BASE_URL")+"/business/order/cost",
      bytes.NewReader(body),
    )
    req.Header.Set("Authorization", "Bearer "+os.Getenv("RUN_API_KEY"))
    req.Header.Set("Content-Type", "application/json")
    res, err := http.DefaultClient.Do(req)
    if err != nil {
      panic(err)
    }
    defer res.Body.Close()
    out, _ := io.ReadAll(res.Body)
    fmt.Println(string(out))
  }
  ```
</RequestExample>

<ResponseExample>
  ```json 200 theme={null}
  {
    "price": 5000,
    "distance_km": 12.4,
    "currency": "NGN",
    "pricing_model": "rate_card",
    "option_id": "band_0_2_5",
    "option_label": "0.5–2.5 kg",
    "delivery_mode": "MOTORBIKE",
    "from_zone_name": "Surulere",
    "to_zone_name": "Ikeja / Omole / Agege / Magodo / Ogba"
  }
  ```

  ```json 400 theme={null}
  {
    "statusCode": 400,
    "timestamp": "2026-08-12T15:18:51.396Z",
    "path": "/api/v2/business/order/cost",
    "message": "weight must not be less than 0.1"
  }
  ```

  ```json 401 theme={null}
  {
    "statusCode": 401,
    "timestamp": "2026-08-12T15:18:51.396Z",
    "path": "/api/v2/business/order/cost",
    "message": "Invalid API key"
  }
  ```

  ```json 403 theme={null}
  {
    "statusCode": 403,
    "timestamp": "2026-08-12T15:18:51.396Z",
    "path": "/api/v2/business/order/cost",
    "message": "Insufficient API key scope"
  }
  ```
</ResponseExample>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.