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

# Complete Multipart Upload

> Assemble the uploaded parts into one object and record the file. This is where the multipart file row is created, so an object-lifecycle header belongs on this call rather than the initiate.

The `fileUrl` returned here is S3's native location, which is **not** publicly readable. Use the `fileUrl` from Initiate Multipart Upload as the model input.



## OpenAPI

````yaml /platform-openapi.json post /storage/upload/complete
openapi: 3.1.0
info:
  title: ModelRunner Platform API
  version: 1.0.0
  description: >-
    Platform APIs: model catalog, search and collections; model pricing rate
    cards; the Serverless GPU catalog and deployment templates; file uploads and
    your asset library; account balance and usage; and webhook delivery
    management. Catalog reads are public; account-scoped routes authenticate
    with your API key (`Authorization: Key <MODELRUNNER_KEY>`). Request
    lifecycle endpoints (submit/status/result and the request list) live on the
    queue host — see the Queue API reference.
servers:
  - url: https://api.modelrunner.run
security: []
paths:
  /storage/upload/complete:
    post:
      summary: Complete Multipart Upload
      description: >-
        Assemble the uploaded parts into one object and record the file. This is
        where the multipart file row is created, so an object-lifecycle header
        belongs on this call rather than the initiate.


        The `fileUrl` returned here is S3's native location, which is **not**
        publicly readable. Use the `fileUrl` from Initiate Multipart Upload as
        the model input.
      parameters:
        - name: X-Modelrunner-Object-Lifecycle-Preference
          in: header
          required: false
          schema:
            type: string
          description: >-
            JSON object setting an expiry for the stored object, e.g.
            `{"expiration_duration_seconds": 3600}`. The countdown starts at
            upload time. See the [data retention guide](/guides/data-retention).
          examples:
            oneHour:
              value: '{"expiration_duration_seconds": 3600}'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - uploadId
                - uploadKey
                - parts
              properties:
                uploadId:
                  type: string
                uploadKey:
                  type: string
                parts:
                  type: array
                  items:
                    type: object
                    required:
                      - partNumber
                      - etag
                    properties:
                      partNumber:
                        type: integer
                        minimum: 1
                      etag:
                        type: string
                        description: >-
                          The `ETag` header from that part's `PUT`, without
                          surrounding quotes.
      responses:
        '200':
          description: Upload assembled.
          content:
            application/json:
              schema:
                type: object
                properties:
                  fileUrl:
                    type: string
                    description: >-
                      S3's native location URL for the assembled object — not
                      the public URL. See the description.
        '401':
          description: Missing or invalid credentials.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
        - apiKeyAuth: []
components:
  schemas:
    ErrorResponse:
      type: object
      properties:
        error:
          type: string
          description: Human-readable error message.
        request_id:
          type: string
          description: Correlation id for support.
  securitySchemes:
    apiKeyAuth:
      type: apiKey
      in: header
      name: Authorization
      description: 'Use the format: Key modelrunner_key'

````