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

# Finalize File Migration

> Step 2 of a migration document load. After the bytes reach the resumable upload URL from Prepare File Migration (`prepareCompanyFileMigration`), call this to verify them and make the version current. Next, call Reconcile File Migration Metadata (`reconcileCompanyFileMigration`) to attach the file to its records, folders, and categories. Everyday uploads use Finalize Upload (`finalizeCompanyFileUpload`) instead.

Verifies the destination object size, normalized MIME type and matching source checksums, then atomically makes this known version current and retains integrity evidence. Retrying an already verified active revision returns its state. A missing object, checksum mismatch, superseded revision or operator version change cannot be finalized. Migration versions must use this endpoint; ordinary file finalization rejects them. Upload completion is separate from asynchronous malware scanning; an infected result requires attention and must not trigger another upload.

Available only while the destination company is in Sandbox mode. Forms are outside this contract.

**Required permission:** `file.upload`

Also requires `file.view` and `file.edit`.




## OpenAPI

````yaml /openapi/generated-external-api.yaml post /api/v1/companies/{companyId}/files/migrations/finalize
openapi: 3.0.3
info:
  title: AI Insurance External API
  description: External API for AI Insurance platform
  version: 1.0.0
  contact:
    email: support@aiinsurance.io
servers:
  - url: https://go.aiinsurance.io
    description: Production
security:
  - ApiKeyAuth: []
paths:
  /api/v1/companies/{companyId}/files/migrations/finalize:
    post:
      tags:
        - Company Files
      summary: Finalize File Migration
      description: >
        Step 2 of a migration document load. After the bytes reach the resumable
        upload URL from Prepare File Migration (`prepareCompanyFileMigration`),
        call this to verify them and make the version current. Next, call
        Reconcile File Migration Metadata (`reconcileCompanyFileMigration`) to
        attach the file to its records, folders, and categories. Everyday
        uploads use Finalize Upload (`finalizeCompanyFileUpload`) instead.


        Verifies the destination object size, normalized MIME type and matching
        source checksums, then atomically makes this known version current and
        retains integrity evidence. Retrying an already verified active revision
        returns its state. A missing object, checksum mismatch, superseded
        revision or operator version change cannot be finalized. Migration
        versions must use this endpoint; ordinary file finalization rejects
        them. Upload completion is separate from asynchronous malware scanning;
        an infected result requires attention and must not trigger another
        upload.


        Available only while the destination company is in Sandbox mode. Forms
        are outside this contract.


        **Required permission:** `file.upload`


        Also requires `file.view` and `file.edit`.
      operationId: finalizeCompanyFileMigration
      parameters:
        - $ref: '#/components/parameters/companyId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              additionalProperties: false
              required:
                - source
                - revision
                - versionId
              properties:
                source:
                  $ref: '#/components/schemas/CompanyFileMigrationSource'
                revision:
                  $ref: '#/components/schemas/CompanyFileMigrationRevision'
                versionId:
                  type: string
                  format: uuid
            examples:
              request:
                summary: Finalize File Migration
                value:
                  source:
                    environment: https://legacy.example.com
                    companyId: legacy-company-42
                    fileId: legacy-file-17
                  revision:
                    bucket: legacy-company-files
                    object: documents/loss-run.pdf
                    generation: '1720000000000000'
                    byteSize: 102400
                    contentType: application/pdf
                    md5Hash: 1B2M2Y8AsgTpgAmY7PhCfg==
                  versionId: 550e8400-e29b-41d4-a716-446655440021
      responses:
        '200':
          description: Durable migration state
          headers:
            Cache-Control:
              schema:
                type: string
              description: Always no-store because state can include upload capabilities.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CompanyFileMigrationState'
              examples:
                success:
                  summary: Finalize File Migration
                  value:
                    sourceId: 550e8400-e29b-41d4-a716-446655440019
                    fileId: 550e8400-e29b-41d4-a716-446655440020
                    currentVersionId: 550e8400-e29b-41d4-a716-446655440021
                    revision:
                      versionId: 550e8400-e29b-41d4-a716-446655440021
                      storageKey: >-
                        companies/example/files/550e8400-e29b-41d4-a716-446655440020/550e8400-e29b-41d4-a716-446655440021
                      state: ready
                      uploadUrl: null
                      byteSize: 102400
                      contentType: application/pdf
                    metadata:
                      displayName: Loss run.pdf
                      displayDate: '2020-01-02T03:04:05.000Z'
                      displayAuthor: Legacy adjuster
                    conflicts: []
        '400':
          description: Invalid migration declaration
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                failure:
                  summary: Invalid migration declaration
                  value:
                    error:
                      code: BadRequest
                      message: Invalid migration declaration
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          description: Source mapping not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                failure:
                  summary: Source mapping not found
                  value:
                    error:
                      code: NotFound
                      message: Migration source was not found
        '409':
          description: Migration requires reconciliation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                failure:
                  summary: Migration requires reconciliation
                  value:
                    error:
                      code: FileMigrationConflict
                      message: destination_version_changed
        '500':
          $ref: '#/components/responses/InternalServerError'
      security:
        - BearerAuth: []
        - ApiKeyAuth: []
components:
  parameters:
    companyId:
      name: companyId
      in: path
      required: true
      schema:
        type: string
        format: uuid
      description: Company identifier
  schemas:
    CompanyFileMigrationSource:
      type: object
      additionalProperties: false
      required:
        - environment
        - companyId
        - fileId
      properties:
        environment:
          type: string
          minLength: 1
          maxLength: 512
          description: >-
            Stable legacy environment identity, at most 512 UTF-8 bytes. Keep it
            unchanged across runs and credential rotations.
        companyId:
          type: string
          minLength: 1
          maxLength: 255
          description: Stable source identifier, at most 255 UTF-8 bytes.
        fileId:
          type: string
          minLength: 1
          maxLength: 255
          description: Stable source identifier, at most 255 UTF-8 bytes.
    CompanyFileMigrationRevision:
      description: >-
        Exact source object declaration. At least one base64 checksum from
        source object metadata is required. Every available common checksum must
        match destination storage before finalization.
      allOf:
        - type: object
          additionalProperties: false
          required:
            - bucket
            - object
            - generation
            - byteSize
            - contentType
          properties:
            bucket:
              type: string
              minLength: 1
              maxLength: 255
            object:
              type: string
              minLength: 1
              maxLength: 2048
            generation:
              type: string
              pattern: ^\d+$
              maxLength: 40
              description: >-
                Exact GCS source generation; pin every source read to this
                generation.
            byteSize:
              type: integer
              minimum: 1
              maximum: 2147483648
            contentType:
              type: string
              minLength: 1
              maxLength: 255
              description: Supported MIME type; normalized to lowercase.
            md5Hash:
              type: string
              pattern: ^[A-Za-z0-9+/]{22}==$
            crc32c:
              type: string
              pattern: ^[A-Za-z0-9+/]{6}==$
        - anyOf:
            - type: object
              required:
                - md5Hash
              properties:
                md5Hash:
                  type: string
                  pattern: ^[A-Za-z0-9+/]{22}==$
            - type: object
              required:
                - crc32c
              properties:
                crc32c:
                  type: string
                  pattern: ^[A-Za-z0-9+/]{6}==$
    CompanyFileMigrationState:
      type: object
      additionalProperties: false
      required:
        - sourceId
        - fileId
        - currentVersionId
        - revision
        - metadata
        - conflicts
      properties:
        sourceId:
          type: string
          format: uuid
        fileId:
          type: string
          format: uuid
        currentVersionId:
          type: string
          format: uuid
          nullable: true
        revision:
          type: object
          additionalProperties: false
          required:
            - versionId
            - storageKey
            - state
            - uploadUrl
            - byteSize
            - contentType
          properties:
            versionId:
              type: string
              format: uuid
            storageKey:
              type: string
            state:
              type: string
              enum:
                - pending
                - ready
                - quarantined
                - infected
            uploadUrl:
              type: string
              nullable: true
              description: >-
                Bearer resumable-upload capability. Present only for an active
                pending revision without conflicts; never log or expose it in
                diagnostics.
            byteSize:
              type: integer
              minimum: 1
              maximum: 2147483648
            contentType:
              type: string
          nullable: true
          description: >-
            Requested revision, or the active revision when none is supplied;
            null if absent or its version was reclaimed.
        metadata:
          $ref: '#/components/schemas/CompanyFileMigrationDisplayMetadata'
        conflicts:
          type: array
          items:
            type: string
          description: >-
            Stable diagnostic codes, including deleted targets, operator version
            changes, superseded source revisions, reclaimed versions and
            infected results.
    ErrorResponse:
      type: object
      description: Standard error response for all external API endpoints
      required:
        - error
      properties:
        error:
          type: object
          required:
            - code
            - message
          properties:
            code:
              type: string
              description: Machine-readable error code
              example: VALIDATION_ERROR
            message:
              type: string
              description: Human-readable error message
              example: 'submissionId: Required field is missing'
            userMessages:
              type: array
              description: >-
                Clean, verbatim-displayable messages — one entry per failure,
                free of error-code tags, field paths, and internal noise.
                Suitable for showing to end users as-is.
              items:
                type: string
              example:
                - Exposures of type 'company' require an address
            details:
              type: array
              description: Additional details for validation errors (field-level errors)
              items:
                type: object
                properties:
                  field:
                    type: string
                    description: The field that caused the error
                    example: submissionId
                  code:
                    type: string
                    description: Stable problem code for this individual validation failure
                    example: BLANK_LIST_ELEMENT
                  reason:
                    type: string
                    description: Stable reason the value violates its canonical contract
                    example: blank-list-element
                  expected:
                    type: string
                    description: The expected canonical value contract
                    example: nonblank trimmed string
                  message:
                    type: string
                    description: Description of the field error
                    example: Required field is missing
    CompanyFileMigrationDisplayMetadata:
      type: object
      additionalProperties: false
      required:
        - displayName
        - displayDate
        - displayAuthor
      properties:
        displayName:
          type: string
          minLength: 1
          maxLength: 1024
          description: Source display name; independent of the storage upload filename.
        displayDate:
          type: string
          format: date-time
          nullable: true
          description: >-
            Source attribution date. Stored at whole-second precision; null
            clears it.
        displayAuthor:
          type: string
          minLength: 1
          maxLength: 255
          nullable: true
          description: >-
            Source attribution label, trimmed. Audit actors remain the
            authenticated importer.
  responses:
    Unauthorized:
      description: Unauthorized - Invalid or missing API key
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          examples:
            missingApiKey:
              summary: Missing API key
              value:
                error:
                  code: AuthenticationError
                  message: API key authentication required
                  userMessages:
                    - API key authentication required
            invalidApiKey:
              summary: >-
                Invalid API key (e.g. unknown key, or a Bearer token used
                instead of an API key)
              value:
                error:
                  code: AuthenticationError
                  message: Invalid API key
                  userMessages:
                    - Invalid API key
    Forbidden:
      description: Forbidden - Insufficient permissions
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          examples:
            insufficientPermissions:
              summary: Insufficient permissions
              value:
                error:
                  code: AuthorizationError
                  message: User is not authorized to perform the requested action
                  userMessages:
                    - User is not authorized to perform the requested action
            companyMismatch:
              summary: A valid API key naming another company in the URL
              value:
                error:
                  code: AuthorizationError
                  message: API key is not scoped to the requested company
                  userMessages:
                    - API key is not scoped to the requested company
    InternalServerError:
      description: Internal Server Error - Unexpected error occurred
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          examples:
            internalError:
              summary: Unexpected server error
              value:
                error:
                  code: UncaughtActionError
                  message: Uncaught error occurred in <actionName>
                  userMessages:
                    - An unexpected error occurred. Please try again later.
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: Authorization
      description: >-
        API key authentication. Send your raw API key as the `Authorization`
        header value with NO scheme prefix — `Authorization: YOUR-API-KEY`. Do
        NOT prefix it with `Bearer ` or `ApiKey `, and do not use an `X-API-Key`
        header; those are not accepted.
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: >-
        User-principal OAuth 2.0 Bearer authentication. Send a user-scoped Auth0
        access token (audience = the app API audience) as `Authorization: Bearer
        <jwt>`. The request resolves to the user's identity and is authorized by
        their Role on the `{companyId}` in the path — the same role-based
        permissions the web app enforces. This is the path the MCP connector
        uses to act on a user's behalf; endpoints that accept it list both
        `BearerAuth` and `ApiKeyAuth`.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.