---
title: "Upload Device Receipt"
method: POST
path: "/device/v1/receipts"
tags: ["device"]
---

# Upload Device Receipt

`POST /device/v1/receipts`

## Request

- Base URL: `https://app.zeno-works.ch` (the document declares no server; this is the origin it was published from)
- URL: `https://app.zeno-works.ch/device/v1/receipts`
- Auth: none declared

File ONE receipt photo/PDF for the paired employee.

JPEG, PNG or PDF only, judged by the file's bytes (``device.unsupportedFormat`` otherwise —
HEIC must be converted on the phone; an archive is refused so one POST cannot become many
Items). The Item, the held intake marker and the owner stamp commit together. The same bytes
sent again by the same employee return the existing receipt (``already_filed``). A phone that
has filed its daily cap is refused with 429 ``device.dailyCapReached``. Poll
``GET /device/v1/receipts?item_id=`` until ``analysis_status`` is ``analyzed``.

Optional form fields (ZR-11): ``category_id`` (from ``GET /device/v1/expense-categories``) and
``purpose`` (≤ 500 characters) — the employee's suggestion. They are shown to the accountant on
Assign and assign nothing by themselves. 422 ``device.categoryNotAvailable`` for a category
that is not an active one of this company (nothing is created). A same-bytes retry keeps the
first upload's suggestion. A card pick does not read them: send them again on the pick.

## Response `200`

Successful Response

- DeviceReceiptUploadOut
  - `item_id` string, required
  - `analysis_status` string, required
  - `already_filed` boolean, required

## Other responses

- `422`: Validation Error

---

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