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

# Camera Check

> Find nearby public road cameras and check the nearest available current frame.

Finds public road cameras run by transport authorities, nearest first, and fetches the nearest available frame. Some cameras refresh only every few minutes. Source fields are observed; distance, converted coordinates, frame\_age\_s and offline are derived. Coverage reports how many cameras the catalogue could find, even when no frame was fetched.

## Authentication

Requires x402 payment in the `payment-signature` header.

## Request Body

**latitude** `number` *required*

Latitude in decimal degrees. From -90 to 90.

**longitude** `number` *required*

Longitude in decimal degrees. From -180 to 180.

**radius\_km** `number`

Search radius in kilometres. From 0 to 50. Defaults to `5`.

**limit** `integer`

Most cameras returned. From 1 to 10. Defaults to `3`.

<Snippet file="audit-context-params.mdx" />

## Response (200 OK)

Top-level envelope: `success` (boolean) and `data` (object). All fields below are nested under `data`.

**data.request\_id** `string`

Durable job ID for audit and lookup

**data.status** `string`

Job status: `completed`

**data.tool** `string`

Always `place_camera_snapshot`

**data.result** `object`

The answer, described under Result below

**data.evidence** `object`

Where the answer came from and when

**data.evidence.source** `string`

The public body the data comes from. Always `Public transport authorities`.

**data.evidence.source\_kind** `string`

`public` when the data comes from a public body, `commercial` otherwise

**data.evidence.retrieved\_at** `string`

When the lookup was made, as an ISO 8601 UTC time

**data.evidence.as\_of** `string | null`

The nearest camera frame capture time when the image headers provide it.

## Result

Nested under `data.result`.

**data.result.cameras** `object[]`

Cameras.

**data.result.cameras\[].observed** `object`

Observed.

**data.result.cameras\[].observed.id** `string`

Id.

**data.result.cameras\[].observed.name** `string`

Name.

**data.result.cameras\[].observed.direction** `string | null`

Direction. `null` when the source gives no value.

**data.result.cameras\[].observed.latitude** `number | null`

Latitude. `null` when the source gives no value.

**data.result.cameras\[].observed.longitude** `number | null`

Longitude. `null` when the source gives no value.

**data.result.cameras\[].observed.source\_position** `object | null`

Source position. `null` when the source gives no value.

**data.result.cameras\[].observed.source\_position.x** `number`

X.

**data.result.cameras\[].observed.source\_position.y** `number`

Y.

**data.result.cameras\[].observed.source\_position.crs** `string`

Crs.

**data.result.cameras\[].observed.frame\_url** `string`

Frame url.

**data.result.cameras\[].observed.frame\_captured\_at** `string | null`

Frame captured at. `null` when the source gives no value.

**data.result.cameras\[].observed.frame\_checked\_at** `string | null`

Frame checked at. `null` when the source gives no value.

**data.result.cameras\[].observed.frame\_fetch\_status** `string`

Frame fetch status.

**data.result.cameras\[].observed.attribution** `string`

Attribution.

**data.result.cameras\[].derived** `object`

Derived.

**data.result.cameras\[].derived.latitude** `object`

Latitude.

**data.result.cameras\[].derived.latitude.value** `number`

Value.

**data.result.cameras\[].derived.latitude.rule** `string`

Rule.

**data.result.cameras\[].derived.latitude.from** `string[]`

From.

**data.result.cameras\[].derived.longitude** `object`

Longitude.

**data.result.cameras\[].derived.longitude.value** `number`

Value.

**data.result.cameras\[].derived.longitude.rule** `string`

Rule.

**data.result.cameras\[].derived.longitude.from** `string[]`

From.

**data.result.cameras\[].derived.distance\_km** `object`

Distance km.

**data.result.cameras\[].derived.distance\_km.value** `number`

Value.

**data.result.cameras\[].derived.distance\_km.rule** `string`

Rule.

**data.result.cameras\[].derived.distance\_km.from** `string[]`

From.

**data.result.cameras\[].derived.frame\_age\_s** `object`

Frame age s.

**data.result.cameras\[].derived.frame\_age\_s.value** `number | null`

Value. `null` when the source gives no value.

**data.result.cameras\[].derived.frame\_age\_s.rule** `string`

Rule.

**data.result.cameras\[].derived.frame\_age\_s.from** `string[]`

From.

**data.result.cameras\[].derived.offline** `object`

Offline.

**data.result.cameras\[].derived.offline.value** `boolean | null`

Value. `null` when the source gives no value.

**data.result.cameras\[].derived.offline.rule** `string`

Rule.

**data.result.cameras\[].derived.offline.from** `string[]`

From.

**data.result.coverage** `object`

Coverage.

**data.result.coverage.cameras\_in\_range** `integer`

Cameras in range.

**data.result.coverage.catalogue\_available** `boolean`

Catalogue available.

**data.result.coverage.networks\_loaded** `string[]`

Networks loaded.

**data.result.total** `integer`

Total.

**data.result.returned** `integer`

Returned.

**data.result.truncated** `boolean`

Truncated.

```bash cURL theme={null}
curl -X POST https://win.oneshotagent.com/v1/tools/lookup/place-camera-snapshot \
  -H "Content-Type: application/json" \
  -H "payment-signature: <base64 x402 payment>" \
  -d '{
    "latitude": 51.60067,
    "longitude": -0.01594
  }'
```

```javascript JavaScript theme={null}
const response = await fetch("https://win.oneshotagent.com/v1/tools/lookup/place-camera-snapshot", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "payment-signature": paymentProof,
  },
  body: JSON.stringify({
    "latitude": 51.60067,
    "longitude": -0.01594
  }),
});
```

```typescript SDK theme={null}
const result = await agent.tool('lookup/place-camera-snapshot', {
  latitude: 51.60067,
  longitude: -0.01594
});
console.log(result.result);
console.log(result.evidence);
```

```json Response (200) theme={null}
{
  "success": true,
  "data": {
    "request_id": "uuid",
    "receipt_id": "rcpt_...",
    "status": "completed",
    "tool": "place_camera_snapshot",
    "result": {
      "cameras": [
        {
          "observed": {
            "id": "tfl:JamCams_00002.00865",
            "name": "A406 Billet Upass E",
            "direction": "West",
            "latitude": 51.60067,
            "longitude": -0.01594,
            "source_position": null,
            "frame_url": "https://s3-eu-west-1.amazonaws.com/jamcams.tfl.gov.uk/00002.00865.jpg",
            "frame_captured_at": "2026-10-28T12:55:16.000Z",
            "frame_checked_at": "2026-10-28T12:55:56.489Z",
            "frame_fetch_status": "succeeded",
            "attribution": "Powered by TfL Open Data"
          },
          "derived": {
            "distance_km": {
              "value": 0,
              "rule": "haversine_km",
              "from": [
                "observed.latitude",
                "observed.longitude",
                "input.latitude",
                "input.longitude"
              ]
            },
            "frame_age_s": {
              "value": 40.489,
              "rule": "elapsed_seconds_since_capture",
              "from": [
                "observed.frame_captured_at",
                "observed.frame_checked_at"
              ]
            },
            "offline": {
              "value": false,
              "rule": "frame_fetch_failed_or_age_over_30_minutes",
              "from": [
                "observed.frame_fetch_status",
                "observed.frame_captured_at",
                "observed.frame_checked_at"
              ]
            }
          }
        }
      ],
      "coverage": {
        "cameras_in_range": 1,
        "catalogue_available": true,
        "networks_loaded": [
          "tfl"
        ]
      },
      "total": 1,
      "returned": 1,
      "truncated": false
    },
    "evidence": {
      "source": "Public transport authorities",
      "source_kind": "public",
      "retrieved_at": "2026-10-28T12:55:56.489Z",
      "calls": [
        {
          "retrieved_at": "2026-10-28T12:55:56.489Z"
        }
      ],
      "as_of": "2026-10-28T12:55:16.000Z"
    }
  }
}
```

> [!NOTE]
>
> See [Pricing](https://docs.oneshotagent.com/pricing.md) for this tool's price. A wallet (x402) call receives it in the 402 quote before anything is charged; a call paid from prepaid credits is charged when the API accepts the request and answers `200`.

## Notes

* An empty list with catalogue\_available true means the loaded catalogue was searched and no cameras were in range. With catalogue\_available false it provides no evidence either way. Neither proves a physical scene is clear.
* coverage.networks\_loaded lists catalogues loaded within 48 hours; coverage is partial outside those networks. Stored cameras remain visible when catalogue refreshes fail.
* Fetches at most three frames in nearest order, stopping after a usable frame. Failed or older-than-30-minute frames are offline and remain listed. Unchecked cameras have null offline and frame\_age\_s.
* frame\_captured\_at comes from the image Last-Modified header; absent or future timestamps are null. HTTP Date and catalogue update times are not image capture times.
* Coordinates converted from Web Mercator are under derived.latitude and derived.longitude, with the original position under observed.source\_position. Other coordinates are under observed.
* radius\_km defaults to 5 (maximum 50); limit defaults to 3 (maximum 10). Return attribution alongside any displayed frame. TxDOT frame URLs return a JSON snippet containing a base64 JPEG.
* Results return inline. The finished job stays available at `/v1/requests/{request_id}`


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.