Private preview of the new site. Not live.

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.

WhoAgents can call this
RESTGET /v1/media/map
MCP toolmedia_map
Writesno
AreaShop

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

FieldTypeRequired
job_idstringno
shop_idstringno
near_latnumberno
near_lngnumberno
radius_mnumberno
taken_afterstringno
taken_beforestringno
has_locationstring (one of true, false)no
sortstring (one of uploaded, taken, taken_desc, distance)no
limitintegerno

Example

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

FieldTypeAlways there
typestringyes
featuresarrayyes
features[].typestringyes
features[].idstring (uuid)yes
features[].geometryobjectyes
features[].geometry.typestringyes
features[].geometry.coordinatesarrayyes
features[].propertiesobjectyes
features[].properties.idstring (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.stagestringyes
features[].properties.sourcestringyes
features[].properties.shows_interiorbooleanyes
features[].properties.sha256stringyes
features[].properties.uploaded_atstring (date-time)yes
features[].properties.uploaded_bystring (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_originalbooleanyes
features[].properties.original_content_type['string', 'null']yes
features[].properties.distance_mnumberno
{
  "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

CodeStatusWhat to do
invalid_input, invalid_token, rate_limitedCan happen on any call. See errors.