---
title: "POST /api/v3/submissions/{id}/files"
method: POST
path: "/api/v3/submissions/{id}/files"
tags: ["Submissions"]
---

# POST /api/v3/submissions/{id}/files

`POST /api/v3/submissions/{id}/files`

## Request

- Base URL: `/` (relative, and the document was published on a file host, not at the API’s origin)
- URL: `/api/v3/submissions/{id}/files`
- Auth: HTTP bearer
- TypeScript: <https://skmtc.dev/wildmeorg/apis/wildbook-v3-api/docs/api/v3/submissions/:id/files/post.ts> (a function with typed inputs; its response is checked against the schema)

One image per request. Server computes digest. Serialize uploads; after a lost response GET manifest and reconcile name/digest and ETag. Same name/content at current revision is a retry success; differing content is 409. Incomplete files are never visible. File.name equals the original multipart filename used in Encounter.mediaAssetN. Reject unsafe names or names requiring cleaning; never silently rename. Same-content retries do not advance revision. Pilot: JPEG/PNG, matching extension, max 200 files and 200 MiB completed bytes per draft; exceeding either returns 413. At most one additional bounded retry candidate exists during upload. Staging must be configured. Serialize uploads; processing contention returns 429.

## Path parameters

- `id` string, uuid, required

## Headers

- `If-Match` string, required

## Request body `multipart/form-data`

- object
  - `file` string, binary, required

## Response `200`

Success

- SubmissionApiManifest
  - `submissionId` string, uuid, required
  - `revision` integer, required
  - `files` SubmissionApiFile[], required
    - `name` string, required: Exact accepted multipart filename; also the row reference.
    - `sizeBytes` integer, required
    - `sha256` string, required
    - `state` 'complete', required
    - `mediaType` string, required

## Other responses

- `400`: Malformed request
- `401`: Authentication required or invalid
- `403`: Not enrolled or not permitted
- `404`: Not found or not visible
- `405`: Method not allowed; Allow header lists supported methods
- `408`: Upload exceeded wall-clock limit
- `409`: State, key or content conflict
- `412`: Stale revision
- `413`: Input too large
- `422`: Input or validation unacceptable
- `428`: Required revision precondition missing
- `429`: Quota or concurrency limit
- `500`: Internal failure; retry only according to operation idempotency rules
- `503`: Feature temporarily unavailable

## Changes

- **2026-09-28** `e22b05e67794`: 12 info
  - added the optional property `issues/items/reason` to the response with the `400` status
  - added the optional property `issues/items/reason` to the response with the `401` status
  - added the optional property `issues/items/reason` to the response with the `403` status
  - added the optional property `issues/items/reason` to the response with the `404` status
  - …8 more
- **2026-09-28** `2918ab3fac48`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/wildmeorg/apis/wildbook-v3-api/changes/api/v3/submissions/:id/files/post.md)

---

[API](https://skmtc.dev/wildmeorg/apis/wildbook-v3-api.md) - [All operations](https://skmtc.dev/wildmeorg/apis/wildbook-v3-api/llms.txt) - [OpenAPI document](https://skmtc.dev/wildmeorg/apis/wildbook-v3-api/revisions/e22b05e67794?raw)
