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

# Finalize an upload

> Call after PUTting your bytes to the presigned `uploadUrl`. Returns the stored upload; pass its `id`/`url` as a `references` entry on a generation. See the [Uploads guide](/uploads) for a full walkthrough.



## OpenAPI

````yaml /openapi.json post /uploads/{uploadId}/complete
openapi: 3.0.3
info:
  title: Dafty API
  version: v1
  description: >-
    Generate on-brand graphics from a simple, opinionated API. Authenticate with
    an API key via the `x-api-key` header (or `Authorization: Bearer`).
    Generation endpoints return `202` with a job; poll `GET /jobs/{id}`
    (optionally `?wait=true`) for the result.
servers:
  - url: https://app.dafty.ai/api/v1
    description: Base URL for all v1 endpoints.
security:
  - apiKey: []
  - bearerAuth: []
tags:
  - name: Account
    description: Who an API key belongs to.
  - name: Images
    description: Generate, edit, resize, and upscale images.
  - name: Videos
    description: >-
      Generate video: animate a single image, or transition between a start and
      end frame. One clip per request.
  - name: Jobs
    description: Poll, list, and cancel asynchronous jobs.
  - name: Styles
    description: Extract brand styles and search their assets.
  - name: Uploads
    description: Bring your own reference images via direct-to-storage upload.
paths:
  /uploads/{uploadId}/complete:
    post:
      tags:
        - Uploads
      summary: Finalize an upload
      description: >-
        Call after PUTting your bytes to the presigned `uploadUrl`. Returns the
        stored upload; pass its `id`/`url` as a `references` entry on a
        generation. See the [Uploads guide](/uploads) for a full walkthrough.
      operationId: completeUpload
      parameters:
        - name: uploadId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/components/schemas/Upload'
                required:
                  - data
              example:
                data:
                  id: 5c1e8b34-2a9f-4d61-8e07-3b2c1a0f9d4e
                  url: https://cdn.example.com/uploads/usr_8a2f3c/logo.png
                  contentType: image/png
                  width: 512
                  height: 512
        '401':
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: Too many requests. A per-key rate limit was hit; back off and retry.
          headers:
            Retry-After:
              description: Seconds to wait before retrying.
              schema:
                type: integer
            X-RateLimit-Limit:
              description: Requests allowed in the current window.
              schema:
                type: integer
            X-RateLimit-Remaining:
              description: Requests remaining in the current window.
              schema:
                type: integer
            X-RateLimit-Reset:
              description: Seconds until the current window resets.
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  schemas:
    Upload:
      type: object
      properties:
        id:
          type: string
        url:
          type: string
        contentType:
          type: string
        width:
          nullable: true
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
        height:
          nullable: true
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
      required:
        - id
        - url
        - contentType
        - width
        - height
      additionalProperties: false
    Error:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              description: >-
                Stable, machine-readable error code. Common values:
                `VALIDATION_ERROR` (400), `NOT_FOUND` (404),
                `INSUFFICIENT_CREDITS` / `SUBSCRIPTION_REQUIRED` (402),
                `RATE_LIMIT_ERROR` / `USAGE_LIMIT_EXCEEDED` /
                `CONCURRENT_LIMIT_REACHED` (429), `INTERNAL_ERROR` (500).
            message:
              type: string
            details:
              type: object
              additionalProperties: true
              nullable: true
              description: >-
                Present on validation errors: the offending fields and why they
                failed.
          required:
            - message
      required:
        - error
  securitySchemes:
    apiKey:
      type: apiKey
      in: header
      name: x-api-key
    bearerAuth:
      type: http
      scheme: bearer

````