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 |
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.
| 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
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 |
{
"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. |