> ## Documentation Index
> Fetch the complete documentation index at: https://docs.plaud.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Generate Presigned Upload URLs

> Request presigned S3 URLs for a multipart upload.

<Note>The file is split into chunks of 5 MB with one presigned URL per part.</Note>

For each part returned:

1. **Send raw bytes to S3** — `PUT PresignedUrl` the raw bytes of the chunk to (no auth needed).
2. **Collect the `ETag`** from each S3 response header — These will be needed in the [complete-upload endpoint](/api-reference/file-upload-api/complete-multipart-upload).



## OpenAPI

````yaml /openapi/file.json post /open/partner/files/upload/generate-presigned-urls
openapi: 3.0.4
info:
  title: File Upload API
  description: >-
    Upload audio files to Plaud storage via S3 multipart upload, then merge the
    parts into a single download URL you can pass to the Transcription API.
    Authenticate with a `user_access_token` (see the Authentication API).


    The upload is a three-step flow:


    1. **Generate presigned URLs** — request one presigned S3 URL per 5 MB
    chunk.

    2. **Upload each chunk** — `PUT` the raw bytes of each chunk directly to its
    presigned S3 URL (no auth; the URL is pre-authorized). Read the `ETag`
    response header for each part. These calls go straight to AWS S3, not to the
    Plaud platform, so they are not documented as endpoints here.

    3. **Complete the upload** — submit the collected `ETag`s to merge the parts
    and receive a `DownloadUrl` (valid ~24h).
  version: 0.0.1
servers:
  - url: https://platform-us.plaud.ai/developer/api
    description: US partner endpoint
  - url: https://platform-jp.plaud.ai/developer/api
    description: Japan partner endpoint
security: []
paths:
  /open/partner/files/upload/generate-presigned-urls:
    post:
      tags:
        - File Upload API
      summary: Generate Presigned Upload URLs
      description: >-
        Request presigned S3 URLs for a multipart upload.


        <Note>The file is split into chunks of 5 MB with one presigned URL per
        part.</Note>


        For each part returned:


        1. **Send raw bytes to S3** — `PUT PresignedUrl` the raw bytes of the
        chunk to (no auth needed).

        2. **Collect the `ETag`** from each S3 response header — These will be
        needed in the [complete-upload
        endpoint](/api-reference/file-upload-api/complete-multipart-upload).
      operationId: generatePresignedUrls
      parameters:
        - $ref: '#/components/parameters/jsonContentType'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/GeneratePresignedUrlsRequest'
            example:
              filesize: 10485760
              filetype: mp3
      responses:
        '200':
          description: Presigned URLs issued
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GeneratePresignedUrlsResponse'
              example:
                FileId: file_xxx
                UploadId: upload_xxx
                ChunkSize: 5242880
                Parts:
                  - PartNumber: 1
                    PresignedUrl: https://plaud-bucket.s3.amazonaws.com/...
                  - PartNumber: 2
                    PresignedUrl: https://plaud-bucket.s3.amazonaws.com/...
      security:
        - bearerAuth: []
components:
  parameters:
    jsonContentType:
      in: header
      name: Content-Type
      schema:
        type: string
        default: application/json
      required: true
  schemas:
    GeneratePresignedUrlsRequest:
      type: object
      required:
        - filesize
        - filetype
      properties:
        filesize:
          type: integer
          description: >-
            Total size of the file, in bytes. Determines how many parts are
            returned.
          example: 10485760
        filetype:
          type: string
          description: File extension of the audio file. ("mp3" or "opus")
          example: mp3
    GeneratePresignedUrlsResponse:
      type: object
      properties:
        FileId:
          type: string
          description: Identifier for the file being uploaded. Pass to complete-upload.
          example: file_xxx
        UploadId:
          type: string
          description: >-
            Identifier for the multipart upload session. Pass to
            complete-upload.
          example: upload_xxx
        ChunkSize:
          type: integer
          description: >-
            Size of each chunk, in bytes. The file should be split into chunks
            of this size.
          example: 5242880
        Parts:
          type: array
          description: >-
            One entry per chunk, each with a presigned S3 URL to PUT the chunk
            to.
          items:
            $ref: '#/components/schemas/PresignedPart'
    PresignedPart:
      type: object
      properties:
        PartNumber:
          type: integer
          description: 1-based index of the chunk.
          example: 1
        PresignedUrl:
          type: string
          description: >-
            Pre-authorized S3 URL. PUT the raw bytes of this chunk to it
            directly (no auth header), then read the `ETag` response header.
          example: https://plaud-bucket.s3.amazonaws.com/...
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        Bearer authentication using a `user_access_token` (see the
        Authentication API).

````