Skip to content

Report a danger spot

Adds a new danger spot. The reporter's own report counts as their first "still dangerous" vote, so a new spot starts with confirmations: 1 and status: unverified.

What happens next depends on the site's moderation setting:

  • Instant publishing (default): the spot is live immediately and pending is false.
  • Held for review: the spot waits for a moderator and pending is true. It won't appear in GET /api/spots until it's approved.

Rate limits: 5 reports per hour per visitor, and 30 per hour per network (IP address), since many phones share a carrier IP.

POST
https://deathspot.org/api/spots

Request bodyJSON

  • titlestringrequired

    Short headline. Phone numbers are replaced with [removed].

    maxLength: 80, minLength: 3
  • latnumberrequired
    format: double, maximum: 4.3, minimum: -1.6
  • lngnumberrequired
    format: double, maximum: 35.1, minimum: 29.5
  • categorymurderormob_actionorboda_gangorrobberyorstabbingorkidnapping+1 morerequired

    What happens at the spot: murder (killing), mob_action, boda_gang, robbery (robbery or snatching), stabbing (stabbing or hacking), kidnapping, other.

  • severityintegerrequired
    maximum: 5, minimum: 1
  • time_of_daydayornightoranyrequired

    When the spot is dangerous.

  • descriptionoptionalstring

    What happened and when it's dangerous. Describe the place, never a person.

    maxLength: 600
    Default: ""
  • areaoptionalstring
    maxLength: 80
    Default: ""
  • incident_dateoptionalstring | null
    format: date
  • source_urloptionalstring | null

    An http or https link. Send "" or null for none.

    format: uri, maxLength: 300

Returns

201

The spot was saved.

JSON
  • spotobjectrequired

    A reported danger spot on the public map.

    18 properties
    • idintegerrequired
      Example: 1
    • titlestringrequired
      maxLength: 80
      Example: "Mukwano Road (near CID HQ)"
    • descriptionstringrequired

      What people should know about the place. It may be empty.

      maxLength: 600
    • latnumberrequired
      format: double, maximum: 4.3, minimum: -1.6
      Example: 0.30827
    • lngnumberrequired
      format: double, maximum: 35.1, minimum: 29.5
      Example: 32.58721
    • areastringrequired

      Neighbourhood, division or landmark. It may be empty.

      maxLength: 80
      Example: "Kibuli, Makindye"
    • categorymurderormob_actionorboda_gangorrobberyorstabbingorkidnapping+1 morerequired

      What happens at the spot: murder (killing), mob_action, boda_gang, robbery (robbery or snatching), stabbing (stabbing or hacking), kidnapping, other.

    • severityintegerrequired

      1 = feels unsafe, 2 = harassment or threats, 3 = robbery or snatching, 4 = violent attack, 5 = someone was killed.

      maximum: 5, minimum: 1
      Example: 5
    • time_of_daydayornightoranyrequired

      When the spot is dangerous.

    • incident_datestring | nullrequired
      format: date
      Example: "2026-09-23"
    • source_urlstring | nullrequired

      A news, police or court source, if the reporter gave one.

      format: uri
    • created_atstringrequired
      format: date-time
    • last_confirmed_atstring | nullrequired

      When someone last voted "still dangerous".

      format: date-time
    • confirmationsintegerrequired

      Number of "still dangerous" votes.

      minimum: 0
    • denialsintegerrequired

      Number of "not anymore" votes.

      minimum: 0
    • statusunverifiedorconfirmedordisputedrequired

      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.

    • moderator_verifiedbooleanrequired

      true when a moderator has checked the spot against a reliable source. Shown as "Verified by moderators".

    • seededbooleanrequired

      true for spots loaded from the project's sourced seed data rather than reported through the app.

  • pendingbooleanrequired

    true when the spot is held for moderator review and not yet on the public map.

400

The report failed validation, for example because the location is outside Uganda or the title is too short.

JSON
  • errorstringrequired

    A human-readable message you can show to users.

  • issuesoptionalarray ofobject

    Every validation problem, in zod's issue format.

    3 properties
    • codeoptionalstring
    • pathoptionalarray ofstring | integer
    • messageoptionalstring

429

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

JSON
  • errorstringrequired

    A human-readable message you can show to users.

500

Unexpected server error, usually because the database is unreachable.

Navigation

Type to search…

↑↓ navigate↵ selectEsc close