---
title: "Mark an upload complete"
method: POST
path: "/uploads/{upload_id}/complete"
tags: ["uploads"]
---

# Mark an upload complete

`POST /uploads/{upload_id}/complete`

Call after PUTting the bytes to the upload URL. Verifies the object landed at the declared size and type, checks the content really is the media it claims to be, and moves the file to ready so it can be delivered. Idempotent: completing an already-ready file just returns it.

## Path parameters

- `upload_id` string, uuid, required — upload identifier to finalize

## Response `200`

OK

- CompleteFileOutputBody
  - `$schema` string, uri — A URL to the JSON Schema for this object.
  - `file` FileSummary, required — One file in the org's library.
    - `created_at` string, date-time, required — When the upload was registered.
    - `download_url` string — Short-lived signed URL to read the file's bytes. Present only for ready files; re-list to refresh an expired one.
    - `filename` string, required — Original filename; used as the display name when the file lands on a phone.
    - `id` string, required — File identifier. Unique across uploads and downloads.
    - `mime_type` string, required — Declared MIME type, pinned by the presigned upload.
    - `size_bytes` integer, required — Declared size in bytes, pinned by the presigned upload.
    - `status` 'uploading' | 'ready', required — uploading until the object is verified in storage, then ready. Complete an upload to move it to ready.

## Other responses

- `default` — Error

## Changes

- **2026-07-26** `a0204e0956bc` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/axilioai/apis/axilio-api/changes/uploads/:upload_id/complete/post.md)

---

[API](https://skmtc.dev/axilioai/apis/axilio-api.md) · [All operations](https://skmtc.dev/axilioai/apis/axilio-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/axilioai/axilio-api/revisions/a0204e0956bc/schema)
