> ## 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.

# Rate cards

> Read-only list of vehicle types and options already set for your business by RUN.

**Read-only.** Custom delivery rates are agreed with **RUN admin** (not through this API). This endpoint only lists the vehicle types and options already configured on your business account so your integration can pass the right `vehicle_type` / `option_id` when quoting.

You cannot create, edit, or negotiate prices here. For rate or route changes, contact RUN support.

Use the catalog before [quoting](/orders/quote-cost) so you do not hardcode option IDs. Live prices always come from [Quote cost](/orders/quote-cost) (or bulk quote).

Requires scope: `orders:read`

## Headers

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

## Response

<ResponseField name="cards" type="array">
  One entry per vehicle type configured for your business.
</ResponseField>

<ResponseField name="cards[].vehicle_type" type="string">
  `bike`, `bus_van`, or `truck`.
</ResponseField>

<ResponseField name="cards[].enabled" type="boolean">
  Whether rate-card quoting is on for this vehicle type.
</ResponseField>

<ResponseField name="cards[].options" type="array">
  Selectable options. For bike these are weight bands (usually omit `option_id` and let weight pick the band). For bus/van and truck, pass `options[].id` as `option_id` on quote/place.
</ResponseField>

<ResponseField name="cards[].options[].id" type="string">
  Stable option id (for example `mini_van`, `ton_15`).
</ResponseField>

<ResponseField name="cards[].options[].label" type="string">
  Human-readable label.
</ResponseField>

<ResponseField name="cards[].options[].min_kg" type="number">
  Bike band lower bound (kg), when present.
</ResponseField>

<ResponseField name="cards[].options[].max_kg" type="number">
  Bike band upper bound (kg), when present.
</ResponseField>

<ResponseField name="cards[].options[].tons" type="number">
  Truck tonnage, when present.
</ResponseField>

<ResponseField name="distance_pricing_enabled" type="boolean">
  When `true`, quotes can fall back to distance pricing if a route is missing from the card.
</ResponseField>

<ResponseField name="zones" type="array">
  Active zones (`_id`, `slug`, `name`) for reference. Zone matching still happens server-side from addresses.
</ResponseField>

<ResponseField name="support_message" type="string">
  Message to show when a route is not on the card and distance fallback is off.
</ResponseField>

## How to use

1. Agree rates with RUN admin (outside this API).
2. Call this endpoint to list options already on your account (cache for a short TTL).
3. Quote with `vehicle_type` (and `option_id` for bus/van or truck) on `POST /business/order/cost`.
4. Place with the same fields on `POST /business/order`.

See [Rate-card pricing](/guides/rate-card-pricing).

<RequestExample>
  ```bash cURL theme={null}
  curl -X GET "$RUN_BASE_URL/business/rate-cards" \
    -H "Authorization: Bearer $RUN_API_KEY"
  ```

  ```javascript Node.js theme={null}
  const res = await fetch(`${process.env.RUN_BASE_URL}/business/rate-cards`, {
    headers: { Authorization: `Bearer ${process.env.RUN_API_KEY}` },
  });
  const catalog = await res.json();
  ```

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

  catalog = requests.get(
      f"{os.environ['RUN_BASE_URL']}/business/rate-cards",
      headers={"Authorization": f"Bearer {os.environ['RUN_API_KEY']}"},
  ).json()
  ```
</RequestExample>

<ResponseExample>
  ```json 200 theme={null}
  {
    "cards": [
      {
        "vehicle_type": "bike",
        "enabled": true,
        "options": [
          {
            "id": "band_0_2_5",
            "label": "0.5–2.5 kg",
            "min_kg": 0.5,
            "max_kg": 2.5
          },
          {
            "id": "band_2_6_5",
            "label": "2.6–5.0 kg",
            "min_kg": 2.6,
            "max_kg": 5.0
          }
        ]
      },
      {
        "vehicle_type": "bus_van",
        "enabled": true,
        "options": [
          { "id": "open_space_bus", "label": "Open Space Bus" },
          { "id": "mini_van", "label": "Mini Van" },
          { "id": "three_ton_bus", "label": "3 Ton Bus" }
        ]
      },
      {
        "vehicle_type": "truck",
        "enabled": true,
        "options": [
          { "id": "ton_5", "label": "5 Ton", "tons": 5 },
          { "id": "ton_15", "label": "15 Ton", "tons": 15 }
        ]
      }
    ],
    "distance_pricing_enabled": false,
    "zones": [
      { "_id": "66f0…", "slug": "surulere", "name": "Surulere" },
      { "_id": "66f1…", "slug": "south_west", "name": "South-West" }
    ],
    "support_message": "This route is not on your rate card. Please contact RUN support to add the locations you need."
  }
  ```

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


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