---
title: "Check a route for danger spots"
description: "Plans driving routes between two points (via OSRM, with alternatives) and lists every\nreported spot within **150 m** of each route. Disputed spots are ignored.\n\nRoutes are sorted **safest first**: by `risk` (the sum of the severities of the spots\nalong the route), then by duration.\n\nRate limit: **20 route checks per minute** per visitor.\n"
---

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

Path: Deathspot UG API › Routing

`GET /api/route`

Plans driving routes between two points (via OSRM, with alternatives) and lists every
reported spot within **150 m** of each route. Disputed spots are ignored.

Routes are sorted **safest first**: by `risk` (the sum of the severities of the spots
along the route), then by duration.

Rate limit: **20 route checks per minute** per visitor.

## Query parameters

- `checkRoute.query.from` (string, required) — Start point as `lat,lng`, inside Uganda.
  - pattern `^-?\d+(\.\d+)?,-?\d+(\.\d+)?$`; example `"0.34918,32.57195"`
- `checkRoute.query.to` (string, required) — Destination as `lat,lng`, inside Uganda.
  - pattern `^-?\d+(\.\d+)?,-?\d+(\.\d+)?$`; example `"0.36582,32.52923"`

## Code samples

### cURL

```curl
curl --request GET \
  --url 'https://deathspot.org/api/route?from=0.34918%2C32.57195&to=0.36582%2C32.52923'
```

### TypeScript

```typescript
const url = 'https://deathspot.org/api/route?from=0.34918%2C32.57195&to=0.36582%2C32.52923';
const options = {method: 'GET'};

fetch(url, options)
  .then(res => res.json())
  .then(json => console.log(json))
  .catch(err => console.error(err));
```

### Python

```python
import requests

url = "https://deathspot.org/api/route?from=0.34918%2C32.57195&to=0.36582%2C32.52923"

response = requests.get(url)

print(response.text)
```

## Responses

### 200

One or more routes, safest first.

#### Example

```json
{
  "routes": [
    {
      "distance": 7350.2,
      "duration": 492.8,
      "line": [
        {
          "lat": 0.1,
          "lng": 0.1
        }
      ],
      "dangers": [
        {
          "spot": {
            "id": 1,
            "title": "Mukwano Road (near CID HQ)",
            "description": "string",
            "lat": 0.30827,
            "lng": 32.58721,
            "area": "Kibuli, Makindye",
            "category": "murder",
            "severity": 5,
            "time_of_day": "day",
            "incident_date": "2026-09-23",
            "source_url": "http://example.com",
            "created_at": "2019-08-24T14:15:22Z",
            "last_confirmed_at": "2019-08-24T14:15:22Z",
            "confirmations": 0,
            "denials": 0,
            "status": "unverified",
            "moderator_verified": true,
            "seeded": true
          },
          "distance": 42.7,
          "along": 1830.4
        }
      ],
      "risk": 10
    }
  ],
  "bufferMeters": 150
}
```

- `checkRoute.response.200.routes` (array<object>, required)
  - `checkRoute.response.200.routes.distance` (number, required) — Route length in metres.
    - example `7350.2`
  - `checkRoute.response.200.routes.duration` (number, required) — Estimated driving time in seconds.
    - example `492.8`
  - `checkRoute.response.200.routes.line` (array<object>, required) — The route geometry as an ordered list of points.
    - `checkRoute.response.200.routes.line.lat` (number, required)
      - format `double`
    - `checkRoute.response.200.routes.line.lng` (number, required)
      - format `double`
  - `checkRoute.response.200.routes.dangers` (array<object>, required)
    - `checkRoute.response.200.routes.dangers.spot` (object, required) — A reported danger spot on the public map.
      - `checkRoute.response.200.routes.dangers.spot.id` (integer, required)
        - example `1`
      - `checkRoute.response.200.routes.dangers.spot.title` (string, required)
        - maxLength 80; example `"Mukwano Road (near CID HQ)"`
      - `checkRoute.response.200.routes.dangers.spot.description` (string, required) — What people should know about the place. It may be empty.
        - maxLength 600
      - `checkRoute.response.200.routes.dangers.spot.lat` (number, required)
        - format `double`; min -1.6; max 4.3; example `0.30827`
      - `checkRoute.response.200.routes.dangers.spot.lng` (number, required)
        - format `double`; min 29.5; max 35.1; example `32.58721`
      - `checkRoute.response.200.routes.dangers.spot.area` (string, required) — Neighbourhood, division or landmark. It may be empty.
        - maxLength 80; example `"Kibuli, Makindye"`
      - `checkRoute.response.200.routes.dangers.spot.category` (string, required) — What happens at the spot: `murder` (killing), `mob_action`, `boda_gang`, `robbery` (robbery or snatching), `stabbing` (stabbing or hacking), `kidnapping`, `other`.
        - one of `"murder"`, `"mob_action"`, `"boda_gang"`, `"robbery"`, `"stabbing"`, `"kidnapping"`, `"other"`
      - `checkRoute.response.200.routes.dangers.spot.severity` (integer, required) — 1 = feels unsafe, 2 = harassment or threats, 3 = robbery or snatching, 4 = violent attack, 5 = someone was killed.
        - min 1; max 5; example `5`
      - `checkRoute.response.200.routes.dangers.spot.time_of_day` (string, required) — When the spot is dangerous.
        - one of `"day"`, `"night"`, `"any"`
      - `checkRoute.response.200.routes.dangers.spot.incident_date` (string | null, required)
        - format `date`; example `"2026-09-23"`
      - `checkRoute.response.200.routes.dangers.spot.source_url` (string | null, required) — A news, police or court source, if the reporter gave one.
        - format `uri`
      - `checkRoute.response.200.routes.dangers.spot.created_at` (string, required)
        - format `date-time`
      - `checkRoute.response.200.routes.dangers.spot.last_confirmed_at` (string | null, required) — When someone last voted "still dangerous".
        - format `date-time`
      - `checkRoute.response.200.routes.dangers.spot.confirmations` (integer, required) — Number of "still dangerous" votes.
        - min 0
      - `checkRoute.response.200.routes.dangers.spot.denials` (integer, required) — Number of "not anymore" votes.
        - min 0
      - `checkRoute.response.200.routes.dangers.spot.status` (string, required) — The community's verdict from votes. `confirmed` needs at least 3 more confirmations than denials, and `disputed` means denials outnumber confirmations by more than 2.
        - one of `"unverified"`, `"confirmed"`, `"disputed"`
      - `checkRoute.response.200.routes.dangers.spot.moderator_verified` (boolean, required) — `true` when a moderator has checked the spot against a reliable source. Shown as "Verified by moderators".
      - `checkRoute.response.200.routes.dangers.spot.seeded` (boolean, required) — `true` for spots loaded from the project's sourced seed data rather than reported through the app.
    - `checkRoute.response.200.routes.dangers.distance` (number, required) — Distance from the route, in metres (at most `bufferMeters`).
      - example `42.7`
    - `checkRoute.response.200.routes.dangers.along` (number, required) — How far into the trip the spot is, in metres. Dangers are sorted by this.
      - example `1830.4`
  - `checkRoute.response.200.routes.risk` (integer, required) — Sum of the severities of `dangers`. Lower is safer.
    - example `10`
- `checkRoute.response.200.bufferMeters` (integer, required) — How close to the route a spot must be to count, in metres.
  - example `150`

### 400

`from` or `to` is missing, malformed, or outside Uganda.

#### Example

```json
{
  "error": "from and to must be lat,lng points inside Uganda"
}
```

- `checkRoute.response.400.error` (string, required) — A human-readable message you can show to users.

### 404

The routing service found no route between the points.

#### Example

```json
{
  "error": "No route found"
}
```

- `checkRoute.response.404.error` (string, required) — A human-readable message you can show to users.

### 429

The caller exceeded a rate limit. Wait `Retry-After` seconds before retrying.

#### Example

```json
{
  "error": "You have reported a lot of spots recently. Please try again in an hour."
}
```

- `checkRoute.response.429.error` (string, required) — A human-readable message you can show to users.

### 502

The upstream routing service (OSRM) is unavailable.

#### Example

```json
{
  "error": "Routing service unavailable"
}
```

- `checkRoute.response.502.error` (string, required) — A human-readable message you can show to users.


Source: https://docs.deathspot.org/api/Routing/checkRoute/index.md
