---
title: "Upload a photo"
method: POST
path: "/v1/images"
tags: ["prints"]
---

# Upload a photo

`POST /v1/images`

## Request

- Base URL: `https://api.noerrands.com/c/prints`
- URL: `https://api.noerrands.com/c/prints/v1/images`
- Auth: HTTP bearer

Upload one photo file (base64 JPEG or PNG, up to 20 MB) to print, and get back an image_id plus how sharp it will print on each product; free -- nothing is printed or charged, and an unordered photo is deleted after 24 hours. A photo with a public https URL can be quoted by URL instead.

## Request body

- object
  - `image_base64` string, required: The photo file itself, base64-encoded (a data: URL prefix is accepted). JPEG or PNG, up to 20 MB. Send the original, not a thumbnail.

## Response `200`

Success.

- object
  - `image_id` string, required: Opaque id, "pi_...". Pass it to quote_prints.
  - `format` 'jpeg' | 'png', required
  - `width` integer, required
  - `height` integer, required
  - `bytes` integer, required
  - `expires_at` string, date-time, required: Deleted at this time unless it is ordered first.
  - `fit` object[], required
    - `product` '4x6' | '5x7' | '8x10' | 'canvas-12x16' | 'tshirt' | 'mug-11oz', required
    - `dpi` integer, required: Effective dots per inch at that size.
    - `quality` 'great' | 'good' | 'fair' | 'low' | 'too_small', required: great (300+ dpi), good (200+), fair (150+), low (60+), too_small (refused). A T-shirt tolerates less: fair from 100 dpi, low from 40.

## Other responses

- `400`: invalid_request
- `401`: unauthorized. Carries WWW-Authenticate: Bearer resource_metadata="..."
- `403`: forbidden_scope: a write tool called with a read-only key.
- `404`: not_found
- `429`: rate_limited
- `502`: provider_error

---

[API](https://skmtc.dev/noerrands/apis/no-errands-prints-api.md) · [All operations](https://skmtc.dev/noerrands/apis/no-errands-prints-api/llms.txt) · [OpenAPI document](https://skmtc.dev/noerrands/apis/no-errands-prints-api/revisions/f3ad0da7ed08?raw)
