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

# iOS — Complete direct-to-S3 multipart upload (replace existing slot)

> iOS-only. Step 2 of 2 for replacing an existing file slot. Finalises the multipart upload, marks existing versions not-current, creates the new DealFolderFileVersion, resets the slot status to NEEDS_APPROVAL, and fires the same notifications as the web replace endpoint (notification type: `deal-folder-file-replaced`). The session_id must be the one returned from /replace/initiate for this same file slot.



## OpenAPI

````yaml /storage/api-docs/api-docs.json post /deal-folder/files/{file}/replace/complete
openapi: 3.0.0
info:
  title: MOGL Core API
  description: >-
    MOGL Platform Core API — powering athlete NIL deals, brand partnerships,
    agent management, payments, messaging, and more.
     *
     * ## Authentication
     * - **JWT Bearer Token**: Most endpoints require a Bearer token obtained via `/api/login`.
     * - **Server-to-Server API Key**: Internal/lambda/cron endpoints use an `X-API-KEY` header.
     *
     * ## Rate Limiting
     * - Registration & login endpoints: 4–15 requests per minute
     * - Public/influencer endpoints: 200 requests per minute
     * - Authenticated endpoints: standard Laravel throttle
  version: 1.0.0
servers:
  - url: http://localhost/mogl/mogl-backend/api
    description: Local
  - url: https://dev-api.mogl.online/api
    description: Dev
  - url: https://staging-api.mogl.online/api
    description: Staging
  - url: https://api.mogl.online/api
    description: Production
security:
  - bearerAuth: []
tags:
  - name: Authentication
    description: Login, registration, password reset
  - name: User Registration - Common
    description: Common user registration & email check
  - name: User Registration - Athlete
    description: Athlete registration & onboarding steps
  - name: User Registration - Partner
    description: Partner/Brand registration & onboarding steps
  - name: User Registration - Agent
    description: Agent registration & onboarding steps
  - name: User Registration - Fan
    description: Fan registration & onboarding steps
  - name: User Profile
    description: User profile management, settings, social media
  - name: Athlete
    description: 'Athlete-specific endpoints: search, details, availability'
  - name: Athlete - Availability Confirmation
    description: Post-hiring availability confirmation workflow
  - name: Athlete - NIL Feed
    description: Athlete NIL feed and partner search
  - name: Athlete - AI Assistant
    description: AI-powered job assistant for athletes — chat and conversation history
  - name: Partner
    description: Partner/Brand-specific endpoints
  - name: Partner - External Job
    description: External job link & applicant management
  - name: Partner - Deliverable Report
    description: Deliverable detail reports for brands
  - name: Partner - Screening Questions
    description: Screening question reports
  - name: Partner - Contract Management
    description: Brand contract management with athletes
  - name: Partner - Content Library
    description: Brand content library for deliverable assets
  - name: Agent
    description: Agent profile, athlete management, contracts
  - name: Agent - Athletes
    description: Agent-athlete relationship management
  - name: Agent - Stripe
    description: Agent payment methods & billing via Stripe
  - name: Agent - Contracts
    description: Agent athlete contract management
  - name: Agent - Availability Confirmation
    description: Agent managing athlete job availability
  - name: Jobs
    description: Job/deal CRUD, search, invitations, hiring, deliverables
  - name: Deals
    description: Deal listing, my deals, bulk operations
  - name: Deal Folder
    description: >-
      Deal folder file workflow — uploads, replacements, approvals, revisions,
      comments. Accessible by athlete, partner/brand, agent, and iOS clients
      (per-action authorisation enforced server-side).
  - name: Deal Folder iOS API
    description: >-
      iOS-only direct-to-S3 multipart upload endpoints for deal folder files
      (initiate/complete for new uploads and replacements). Web clients should
      use the standard `Deal Folder` upload/replace endpoints instead.
  - name: Chat
    description: Messaging, chat contacts, notifications
  - name: Notifications
    description: Notification preferences, in-app notifications
  - name: Payments
    description: Stripe payments, payment history, cards, bulk pay
  - name: Subscription
    description: Brand subscription plans & management
  - name: Public Pages
    description: Public content endpoints (no auth required)
  - name: Public - Influencer/SEO
    description: Public influencer discovery, sitemaps, directories
  - name: Services
    description: Athlete service marketplace
  - name: iOS Device
    description: iOS device tokens, live activities
  - name: Onboarding Tutorial
    description: Onboarding tutorial progress
  - name: MOGL Rosters
    description: Roster management & display
  - name: Internal / Cron
    description: Server-to-server and cron job endpoints
  - name: Affiliate
    description: Athlete affiliate links & tracking
paths:
  /deal-folder/files/{file}/replace/complete:
    post:
      tags:
        - Deal Folder iOS API
      summary: iOS — Complete direct-to-S3 multipart upload (replace existing slot)
      description: >-
        iOS-only. Step 2 of 2 for replacing an existing file slot. Finalises the
        multipart upload, marks existing versions not-current, creates the new
        DealFolderFileVersion, resets the slot status to NEEDS_APPROVAL, and
        fires the same notifications as the web replace endpoint (notification
        type: `deal-folder-file-replaced`). The session_id must be the one
        returned from /replace/initiate for this same file slot.
      operationId: completeDealFolderReplaceUpload
      parameters:
        - name: file
          in: path
          description: DealFolderFile ID (slot ID).
          required: true
          schema:
            type: integer
            example: 5
      requestBody:
        required: true
        content:
          application/json:
            schema:
              required:
                - session_id
                - parts
              properties:
                session_id:
                  description: '`session_id` returned from /replace/initiate.'
                  type: integer
                  example: 512
                parts:
                  description: >-
                    One entry per uploaded part. Order does not matter; the
                    server sorts by `part_number` before calling S3
                    CompleteMultipartUpload.
                  type: array
                  items:
                    required:
                      - part_number
                      - etag
                    properties:
                      part_number:
                        type: integer
                        maximum: 10000
                        minimum: 1
                        example: 1
                      etag:
                        description: >-
                          ETag header returned by S3 for that part's PUT
                          (include the surrounding double-quotes exactly as S3
                          returns them).
                        type: string
                        example: '"9bb58f26192e4ba00f01e2e7b136bbd8"'
                    type: object
                  minItems: 1
              type: object
      responses:
        '200':
          description: File slot replaced
          content:
            application/json:
              schema:
                properties:
                  status:
                    type: string
                    example: success
                  message:
                    type: string
                    example: File replaced successfully.
                  data:
                    $ref: '#/components/schemas/DealFolderFile'
                type: object
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UnauthorizedResponse'
        '404':
          description: >-
            Deal folder file or upload session not found / session does not
            belong to this slot
          content:
            application/json:
              schema:
                properties:
                  status:
                    type: string
                    example: error
                  message:
                    type: string
                    example: Upload session not found.
                type: object
        '422':
          description: Validation error / session expired / not authorised / voided slot
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorResponse'
        '500':
          description: S3 CompleteMultipartUpload or persistence failed
          content:
            application/json:
              schema:
                properties:
                  status:
                    type: string
                    example: error
                  message:
                    type: string
                    example: >-
                      Something went wrong while saving your file. Please try
                      again.
                type: object
      security:
        - bearerAuth: []
components:
  schemas:
    DealFolderFile:
      description: >-
        A Deal Folder file slot (workflow unit). The integer `status` field and
        its rolled-up string equivalents (`deal_folder_file_status` at the
        milestone level, `deal_folder_status` at the folder level) all draw from
        the same App\\Enums\\DealFolderStatus values.
      properties:
        id:
          type: integer
          example: 5
        deal_folder_id:
          type: integer
          example: 12
        milestone_athlete_rel_id:
          type: integer
          example: 88
        slot_number:
          type: integer
          example: 1
        status:
          description: >-
            **File state** (raw integer). `0` = Awaiting Upload, `1` = Needs
            Approval, `2` = Revision Requested, `3` = File Approved, `4` =
            Voided.
          type: integer
          enum:
            - 0
            - 1
            - 2
            - 3
            - 4
          example: 1
        status_label:
          description: >-
            **File state** (label for `status`). Only present in
            `/deal-folder/athlete-job-details` responses.
          type: string
          enum:
            - Awaiting Upload
            - Needs Approval
            - Revision Requested
            - File Approved
            - Voided
          example: Needs Approval
        uploaded_by_user_id:
          type: integer
          example: 42
        current_version:
          $ref: '#/components/schemas/DealFolderFileVersion'
        created_at:
          type: string
          format: date-time
          example: '2026-04-01T12:00:00Z'
        updated_at:
          type: string
          format: date-time
          example: '2026-04-01T12:05:00Z'
        deleted_at:
          type: string
          format: date-time
          example: null
          nullable: true
      type: object
    UnauthorizedResponse:
      properties:
        message:
          type: string
          example: Unauthenticated.
      type: object
    ValidationErrorResponse:
      properties:
        message:
          type: string
          example: The given data was invalid.
        errors:
          type: object
          additionalProperties:
            type: array
            items:
              type: string
      type: object
    DealFolderFileVersion:
      description: A single uploaded version of a Deal Folder file slot.
      properties:
        id:
          type: integer
          example: 11
        deal_folder_file_id:
          type: integer
          example: 5
        file_path:
          type: string
          example: deal-folders/12/slot-1/v1/foo.mp4
        file_name:
          type: string
          example: foo.mp4
        file_size:
          description: Size in bytes
          type: integer
          example: 8421376
        file_mime_type:
          type: string
          example: video/mp4
        thumbnail_path:
          type: string
          example: null
          nullable: true
        version_number:
          type: integer
          example: 1
        is_current:
          type: boolean
          example: true
        uploaded_by_user_id:
          type: integer
          example: 42
        created_at:
          type: string
          format: date-time
          example: '2026-04-01T12:00:00Z'
        updated_at:
          type: string
          format: date-time
          example: '2026-04-01T12:00:00Z'
      type: object
  securitySchemes:
    bearerAuth:
      type: http
      description: >-
        JWT Bearer token authentication. Use the /api/login endpoint to obtain a
        token.
      scheme: bearer
      bearerFormat: JWT

````