---
title: media.map | Doing Work API
description: Photos with a GPS location as a GeoJSON FeatureCollection (points in longitude, latitude order), ready for a map. Takes the same filters as media.list.
url: https://doingwork.work/docs/reference/media-map/
---

# media.map

Photos with a GPS location as a GeoJSON FeatureCollection (points in longitude, latitude order), ready for a map. Takes the same filters as media.list.

|  |  |
|---|---|
| Who | Agents can call this |
| REST | `GET /v1/media/map` |
| MCP tool | `media_map` |
| Writes | no |
| Area | [Shop](https://doingwork.work/docs/reference/#shop) |

## When to use it

Upload a photo with media.requestUpload and PUT the bytes to the upload_url. The shop's copy keeps everything the camera wrote: Doing Work reads the taken time, GPS latitude, longitude and altitude, compass heading, accuracy, camera make and model, lens and orientation into fields you can query, and keeps the original HEIC when a phone photo is converted to JPEG.

## What to tell the owner

Tell them what you found in plain words. Don't read back raw fields.

## Input

| Field | Type | Required |
|---|---|---|
| `job_id` | string | no |
| `shop_id` | string | no |
| `near_lat` | number | no |
| `near_lng` | number | no |
| `radius_m` | number | no |
| `taken_after` | string | no |
| `taken_before` | string | no |
| `has_location` | string (one of true, false) | no |
| `sort` | string (one of uploaded, taken, taken_desc, distance) | no |
| `limit` | integer | no |

## Example

```http
GET https://doingwork.work/v1/media/map?job_id=00000000-0000-4000-8000-000000000000&shop_id=00000000-0000-4000-8000-000000000000&near_lat=...&near_lng=...&radius_m=...&taken_after=...&taken_before=...&has_location=true&sort=uploaded&limit=1
```

## Output

| Field | Type | Always there |
|---|---|---|
| `type` | string | yes |
| `features` | array | yes |
| `features[].type` | string | yes |
| `features[].id` | string (uuid) | yes |
| `features[].geometry` | object | yes |
| `features[].geometry.type` | string | yes |
| `features[].geometry.coordinates` | array | yes |
| `features[].properties` | object | yes |
| `features[].properties.id` | string (uuid) | yes |
| `features[].properties.job_id` | ['string', 'null', ' ', '(', 'u', 'u', 'i', 'd', ')'] | yes |
| `features[].properties.home_id` | ['string', 'null', ' ', '(', 'u', 'u', 'i', 'd', ')'] | yes |
| `features[].properties.stage` | string | yes |
| `features[].properties.source` | string | yes |
| `features[].properties.shows_interior` | boolean | yes |
| `features[].properties.sha256` | string | yes |
| `features[].properties.uploaded_at` | string (date-time) | yes |
| `features[].properties.uploaded_by` | string (uuid) | yes |
| `features[].properties.taken_at` | ['string', 'null', ' ', '(', 'd', 'a', 't', 'e', '-', 't', 'i', 'm', 'e', ')'] | yes |
| `features[].properties.taken_at_local` | ['string', 'null'] | yes |
| `features[].properties.gps_heading` | ['number', 'null'] | yes |
| `features[].properties.gps_accuracy_m` | ['number', 'null'] | yes |
| `features[].properties.camera_make` | ['string', 'null'] | yes |
| `features[].properties.camera_model` | ['string', 'null'] | yes |
| `features[].properties.lens` | ['string', 'null'] | yes |
| `features[].properties.orientation` | ['integer', 'null'] | yes |
| `features[].properties.width` | ['integer', 'null'] | yes |
| `features[].properties.height` | ['integer', 'null'] | yes |
| `features[].properties.has_original` | boolean | yes |
| `features[].properties.original_content_type` | ['string', 'null'] | yes |
| `features[].properties.distance_m` | number | no |

```json
{
  "type": "...",
  "features": [
    {
      "type": "...",
      "id": "00000000-0000-4000-8000-000000000000",
      "geometry": {
        "type": "...",
        "coordinates": [
          "..."
        ]
      },
      "properties": {
        "id": "00000000-0000-4000-8000-000000000000",
        "job_id": "00000000-0000-4000-8000-000000000000",
        "home_id": "00000000-0000-4000-8000-000000000000",
        "stage": "...",
        "source": "...",
        "shows_interior": true,
        "sha256": "...",
        "uploaded_at": "...",
        "uploaded_by": "00000000-0000-4000-8000-000000000000",
        "taken_at": "...",
        "taken_at_local": "...",
        "gps_heading": "...",
        "gps_accuracy_m": "...",
        "camera_make": "...",
        "camera_model": "...",
        "lens": "...",
        "orientation": "...",
        "width": "...",
        "height": "...",
        "has_original": true,
        "original_content_type": "..."
      }
    }
  ]
}
```

## Errors

| Code | Status | What to do |
|---|---|---|
| `invalid_input`, `invalid_token`, `rate_limited` |  | Can happen on any call. See [errors](https://doingwork.work/docs/errors/). |
