---
title: "Create a file: an upload link, or parts for larger files, plus an upload page for a person"
method: POST
path: "/api/v1/files"
tags: ["Files"]
---

# Create a file: an upload link, or parts for larger files, plus an upload page for a person

`POST /api/v1/files`

## Request

- Base URL: `https://audo.ai`
- URL: `https://audo.ai/api/v1/files`
- Auth: one of:
  - HTTP bearer
  - API key in cookie `__Secure-audo.session_token`

The response has an upload link for one PUT of up to 100 MB (upload), or, when sizeBytes is over 16 MB, parts (multipart): PUT part n to multipart.partUrl with {n} replaced by n, then POST multipart.completeUrl. One token covers every part. Or give uploadPageUrl to a person.

## Request body

- object
  - `filename` string: Needed, with sizeBytes, to get a signed upload link now
  - `sizeBytes` integer
  - `contentType` string
  - `idempotencyKey` string
  - `tool` 'remove_noise' | 'enhance_voice' | 'transcribe_audio' | 'align_script' | 'cut_audio' | 'remove_silence' | 'adjust_loudness' | 'convert_audio' | 'join_audio' | 'replace_audio' | 'analyze_audio' | 'remove_fillers' | 'level_speakers' | 'mix_tracks': The tool the file is for. Only a browser paying without signing in needs it: its uploads are counted like free ones, and a tool that takes several files may have that many waiting

## Response `201`

OK

- object
  - `file` object, required
    - `id` string, required
    - `kind` 'original' | 'output', required
    - `status` 'awaiting_upload' | 'processing' | 'ready' | 'invalid' | 'deleted', required
    - `filename` string, required
    - `contentType` string, required
    - `sizeBytes` integer, nullable, required
    - `durationSeconds` number, nullable, required
    - `format` string, nullable, required: The container, such as wav or mp4
    - `hasVideo` boolean, required
    - `hasAudio` boolean, required: False for a video without sound, which only replace_audio takes
    - `media` object, nullable, required: Audio and video details, once the file is checked. Null for text files
      - `codec` string, nullable, required: The audio codec, such as aac or pcm_s16le
      - `sampleRate` integer, nullable, required
      - `channels` integer, nullable, required
      - `width` integer, nullable, required: The video's width in pixels, or null without video
      - `height` integer, nullable, required
    - `error` object, nullable, required
      - `code` string, required
      - `message` string, required
    - `prices` object, nullable, required: Credits each tool costs to process this file, once its length is known
    - `sourceJobId` string, nullable, required
    - `createdAt` string, required: ISO 8601 time
    - `expiresAt` string, required: ISO 8601 time
  - `upload` object, nullable, required: One PUT, up to 100 MB
    - `method` 'PUT', required
    - `url` string, required
    - `headers` object, required
    - `expiresAt` string, required: ISO 8601 time
  - `multipart` object, nullable, required: Upload in parts instead, for larger files
    - `partSizeBytes` integer, required: Every part is this size, except the last
    - `partCount` integer, required
    - `partUrl` string, required: Where part n goes (PUT), with {n} in place of the part number, counting from 1
    - `completeUrl` string, required: POST here once every part is in. It joins them, or lists the parts that haven't arrived (details.missingParts)
    - `expiresAt` string, required: ISO 8601 time
  - `uploadPageUrl` string, required: A web page where the person can upload this file

## Other responses

- `default`: An error, with what went wrong and what to do next

---

[API](https://skmtc.dev/audo/apis/audo-api.md) · [All operations](https://skmtc.dev/audo/apis/audo-api/llms.txt) · [OpenAPI document](https://skmtc.dev/audo/apis/audo-api/revisions/0800e93224eb?raw)
