---
title: "Confirm file upload"
method: POST
path: "/v1/upload/confirm"
---

# Confirm file upload

`POST /v1/upload/confirm`

## Request

- Base URL: `https://api.ffmpeg-micro.com`
- URL: `https://api.ffmpeg-micro.com/v1/upload/confirm`
- Auth: HTTP bearer

Confirms that a file has been successfully uploaded to GCS. This is the final step in the upload workflow.
**Use the returned GCS URL in your transcode requests:** - Format: `gs://bucket-name/filename` - Example: `gs://<YOUR_BUCKET>/20251023-143045-my-video.mp4`

## Request body

- object
  - `filename` string, required: Filename returned from presigned URL generation
  - `fileSize` integer, required: Actual uploaded size in bytes as a JSON number (must match the object in GCS). Same rules as presign: not a string, must be finite and positive.
  - `uploadId` string: Optional upload ID for tracking

## Response `200`

Upload confirmed successfully

- object
  - `success` boolean
  - `result` object
    - `fileUrl` string: GCS URL (`gs://…`) for use in transcode/transcribe requests
    - `downloadUrl` string, uri: Short-lived (1 hour) signed HTTPS URL for the uploaded file
    - `filename` string
    - `fileSize` integer: Actual size in bytes as verified in GCS
    - `uploadedAt` string, date-time
    - `metadata` MediaMetadata: What ffprobe reported about a media file. `duration_seconds`, `format` and `size_bytes` may carry `0` or `"unknown"` when the probe ran but could not determine them (a still image has no duration). `width`, `height`, `fps`, `codec_video`, `codec_audio`, `has_video` and `has_audio` are present only when the probe reported them: a plain audio file has no `width`. Cover art embedded in an audio file is a video stream to ffprobe, so such a file reports `has_video: true` with the artwork's dimensions. `width` and `height` are the stored dimensions, before any rotation the file carries: a phone video shot upright can report 1920 by 1080.
      - `duration_seconds` number
      - `format` string: Container format as ffprobe names it
      - `size_bytes` integer
      - `width` integer: Video width in pixels; absent for audio-only files
      - `height` integer: Video height in pixels; absent for audio-only files
      - `fps` number: Frame rate of the video stream; absent for audio-only files
      - `codec_video` string: Codec of the video stream (e.g. h264); absent when there is none
      - `codec_audio` string: Codec of the audio stream (e.g. aac); absent when there is none
      - `has_video` boolean: Whether the file has a video stream
      - `has_audio` boolean: Whether the file has an audio stream

## Other responses

- `400`: Bad Request
- `401`: Missing/invalid API key
- `500`: Unexpected error

---

[API](https://skmtc.dev/ffmpeg-micro/apis/ffmpeg-micro-api.md) · [All operations](https://skmtc.dev/ffmpeg-micro/apis/ffmpeg-micro-api/llms.txt) · [OpenAPI document](https://skmtc.dev/ffmpeg-micro/apis/ffmpeg-micro-api/revisions/64bb930ff345?raw)
