---
title: "Get Proof of Delivery Photo"
method: GET
path: "/proof-of-delivery/photos/{id}"
tags: ["Proof of Delivery"]
---

# Get Proof of Delivery Photo

`GET /proof-of-delivery/photos/{id}`

## Request

- Base URL: `https://api.smartroutes.io/v2`
- URL: `https://api.smartroutes.io/v2/proof-of-delivery/photos/{id}`
- Auth: none declared

Retrieve the compressed proof-of-delivery photo by its ID. By default returns the raw image binary. Use the `encoding` query parameter to request a Base64-encoded JSON response instead.

Photos are compressed asynchronously after the driver uploads them. If the photo exists but compression has not finished, this endpoint returns `202 Accepted` with a `Retry-After` header and the photo's model (`id` and `is_compressed: false`) as the JSON body, instead of image data — retry after the interval given. The `photos` arrays on order and plan responses list every synced photo as soon as it exists, including photos that are still compressing, so a URL taken from one of those responses may itself return a `202` if followed before compression finishes — apply the same retry logic.

## Path parameters

- `id` integer, required: The ID of the photo to retrieve.

## Query parameters

- `encoding` 'base64': Set to `base64` to receive the image as a Base64-encoded string in a JSON response instead of raw binary.

## Response `200`

Successful response. Returns raw image binary by default, or a JSON object when `encoding=base64` is specified.

## Other responses

- `202`: The photo exists but SmartRoutes has not finished compressing it yet, so no image data is returned. This is a `2xx` response, not an error — retry after the interval given in the `Retry-After` header. The body carries the photo's model with `is_compressed: false`. A photo normally becomes available within a few retries.
- `403`: Forbidden. Returned for rate-limit exhaustion (`name = FORBIDDEN`, with `details.retry_after_seconds` and `Retry-After` header) and permission gate failures (`name = PERMISSION`). Inspect `name` to disambiguate. Send `x-sr-api-features: rate-limit-429` to receive `429 RATE_LIMIT_EXCEEDED` for the rate-limit case instead, leaving `403` to mean permission failures only — see [API Features](#section/Getting-started/API-Features).
- `404`: The requested resource was not found.
- `429`: Rate limit exceeded (`name = RATE_LIMIT_EXCEEDED`). **Only returned to callers that opt in** with the `x-sr-api-features: rate-limit-429` request header; without it the same condition returns `403` with `name = FORBIDDEN` and an otherwise identical body. See [API Features](#section/Getting-started/API-Features).
- `500`: An unexpected server error occurred. The body carries only `name` and `description`: internal details are never returned.

---

[API](https://skmtc.dev/smartroutes/apis/smartroutes-api.md) · [All operations](https://skmtc.dev/smartroutes/apis/smartroutes-api/llms.txt) · [OpenAPI document](https://skmtc.dev/smartroutes/apis/smartroutes-api/revisions/a7ea507afac7?raw)
