---
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.
    - `attachment_url` string — Short-lived signed URL that downloads the file as an attachment under its name. Present only for ready files.
    - `bytes_transferred` integer — Bytes moved so far for an in-flight phone transfer. Absent until the phone reports progress.
    - `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.
    - `duration_seconds` integer — Video duration in seconds.
    - `filename` string, required — Original filename; used as the display name when the file lands on a phone.
    - `height` integer — Intrinsic pixel height of the source.
    - `id` string, required — File identifier. Unique across uploads and downloads.
    - `mime_type` string, required — Declared MIME type, pinned by the presigned upload.
    - `on_phone_count` integer, required — Distinct phones currently holding or receiving a copy. Deleting the file recalls these.
    - `preview_state` 'processing' | 'ready' | 'unavailable', required — Whether the preview exists, is still being generated, or will never be available for this format.
    - `reel_url` string — Short-lived signed URL for the animated hover preview. Videos only; absent until generated.
    - `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.
    - `thumbnail_url` string — Short-lived signed URL for the generated preview image. Absent while generation is pending, and permanently absent for formats without a preview.
    - `width` integer — Intrinsic pixel width of the source.

## Other responses

- `default` — Error

---

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