kreatorflow-ai Uploads API

The Uploads API from kreatorflow-ai — 4 operation(s) for uploads.

Operations 5

POST /v1/uploads Create a workspace-scoped upload_id for image, video, or audio references #
PUT /v1/uploads Legacy proxy upload for small reference bytes (<4.5MB); prefer the… #
POST /v1/uploads/complete Finalize and activate an upload whose bytes were PUT to direct_upload_url… #
DELETE /v1/uploads/{upload_id} Delete an owned developer-API upload (URL-encode the upload_id) and free its… #
GET /v1/storage Read the workspace's developer-API storage usage: quota_used_bytes (your… #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/kreatorflow-ai:kreatorflow-ai-uploads-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

kreatorflow-ai-uploads-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Kreatorflow Ai Uploads API
  version: '2026-06-10'
  contact:
    name: KreatorFlow
    url: https://kreatorflow.ai/developers
    email: harry@kreatorflow.ai
  termsOfService: https://kreatorflow.ai/terms
  description: 'Operations tagged Uploads across 2 of this provider''s published API definitions: developers.kreatorflow.ai-openapi.json, kreatorflow-ai-openapi.json. Each path carries the servers of the definition it was published in.'
servers:
- url: https://kreatorflow.ai
  description: Production
security:
- bearerAuth: []
- apiKeyHeader: []
tags:
- name: Uploads
paths:
  /v1/uploads:
    post:
      operationId: postUploads
      summary: Create a workspace-scoped upload_id for image, video, or audio references
      description: 'Create a workspace-scoped upload_id for image, video, or audio references. Required scope: uploads:create. Rate limit: 60 per 60 seconds per account.'
      tags:
      - Uploads
      x-required-scope: uploads:create
      parameters:
      - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UploadCreateRequest'
      responses:
        '200':
          description: Success.
          content:
            application/json:
              schema:
                type: object
                required:
                - success
                - data
                properties:
                  success:
                    type: boolean
                    const: true
                  data:
                    $ref: '#/components/schemas/UploadCreateResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '429':
          $ref: '#/components/responses/RateLimited'
    put:
      operationId: putUploads
      summary: Legacy proxy upload for small reference bytes (<4.5MB); prefer the…
      description: 'Legacy proxy upload for small reference bytes (<4.5MB); prefer the direct_upload_url flow for larger files. Required scope: uploads:create. Rate limit: 60 per 60 seconds per account.'
      tags:
      - Uploads
      x-required-scope: uploads:create
      parameters:
      - name: upload_id
        in: query
        required: true
        schema:
          type: string
      requestBody:
        required: true
        content:
          application/octet-stream:
            schema:
              type: string
              format: binary
      responses:
        '200':
          description: Success.
          content:
            application/json:
              schema:
                type: object
                required:
                - success
                - data
                properties:
                  success:
                    type: boolean
                    const: true
                  data:
                    type: object
                    additionalProperties: true
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '429':
          $ref: '#/components/responses/RateLimited'
    servers:
    - url: https://kreatorflow.ai
      description: Production
  /v1/uploads/complete:
    post:
      operationId: postUploadsComplete
      summary: Finalize and activate an upload whose bytes were PUT to direct_upload_url…
      description: 'Finalize and activate an upload whose bytes were PUT to direct_upload_url; returns the ready upload_id. Required scope: uploads:create.'
      tags:
      - Uploads
      x-required-scope: uploads:create
      parameters:
      - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
              - upload_id
              properties:
                upload_id:
                  type: string
      responses:
        '200':
          description: Success.
          content:
            application/json:
              schema:
                type: object
                required:
                - success
                - data
                properties:
                  success:
                    type: boolean
                    const: true
                  data:
                    $ref: '#/components/schemas/UploadCompleteResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '429':
          $ref: '#/components/responses/RateLimited'
    servers:
    - url: https://kreatorflow.ai
      description: Production
  /v1/uploads/{upload_id}:
    delete:
      operationId: deleteUploadsByUploadId
      summary: Delete an owned developer-API upload (URL-encode the upload_id) and free its…
      description: 'Delete an owned developer-API upload (URL-encode the upload_id) and free its bytes from storage usage; 409 upload_in_use while a queued/processing job references it. Required scope: uploads:create. Rate limit: 60 per 60 seconds per account.'
      tags:
      - Uploads
      x-required-scope: uploads:create
      parameters:
      - name: upload_id
        in: path
        required: true
        schema:
          type: string
        description: The upload_id, URL-encoded.
      responses:
        '200':
          description: Success.
          content:
            application/json:
              schema:
                type: object
                required:
                - success
                - data
                properties:
                  success:
                    type: boolean
                    const: true
                  data:
                    type: object
                    additionalProperties: true
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/RateLimited'
    servers:
    - url: https://kreatorflow.ai
      description: Production
  /v1/storage:
    get:
      operationId: getStorage
      summary: 'Read the workspace''s developer-API storage usage: quota_used_bytes (your…'
      description: 'Read the workspace''s developer-API storage usage: quota_used_bytes (your /v1/uploads, what counts against the quota), included_bytes, used_bytes (everything stored, including outputs), outputs_bytes, has_pack, tier, free_allowance_bytes. Required scope: models:read. Rate limit: 60 per 60 seconds per account.'
      tags:
      - Uploads
      x-required-scope: models:read
      responses:
        '200':
          description: Success.
          content:
            application/json:
              schema:
                type: object
                required:
                - success
                - data
                properties:
                  success:
                    type: boolean
                    const: true
                  data:
                    type: object
                    additionalProperties: true
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '429':
          $ref: '#/components/responses/RateLimited'
    servers:
    - url: https://kreatorflow.ai
      description: Production
components:
  schemas:
    UploadCreateRequest:
      type: object
      properties:
        file_name:
          type: string
          description: string required; camelCase fileName also accepted
        mime_type:
          type: string
          description: string required; camelCase mimeType also accepted
        file_size:
          type: number
          description: number required; camelCase fileSize also accepted
        upload_type:
          type: string
          description: IMAGE, VIDEO, OTHER, or AUDIO; camelCase uploadType also accepted
      required:
      - file_name
      - mime_type
      - file_size
      additionalProperties: true
    UploadCompleteResponse:
      type: object
      properties:
        upload_id:
          type: string
          description: the now-ready workspace-scoped upload_id; uploadId is also returned
        status:
          type: string
          description: '"ready" once the stored bytes are verified and the upload is usable'
        file_size:
          type: string
          description: verified stored file size in bytes
        mime_type:
          type: string
          description: verified stored MIME type (the sniffed content type)
      additionalProperties: true
    Error:
      type: object
      required:
      - success
      - code
      - error
      properties:
        success:
          type: boolean
          const: false
        code:
          type: string
          description: Machine-readable error code.
          enum:
          - account_not_active
          - aspect_ratio_not_supported
          - audio_reference_too_long
          - audio_too_long
          - audio_too_short
          - audio_unreadable
          - audio_upload_not_found
          - character_not_found
          - character_pending
          - character_reference_limit_exceeded
          - character_reference_unusable
          - character_reference_upload_required
          - character_registration_failed
          - character_trusted_asset_failed
          - dispatch_disabled
          - duration_not_supported
          - face_consent_required
          - generation_dispatch_failed
          - generation_dispatch_missing
          - generation_failed
          - generation_output_missing
          - generation_poll_failed
          - generation_rejected
          - generation_timeout
          - generation_unavailable
          - image_rejected
          - image_upload_not_found
          - insufficient_balance
          - internal_error
          - invalid_api_key
          - job_not_found
          - model_not_found
          - paid_account_required
          - paid_check_unavailable
          - prompt_required
          - prompt_too_long
          - rate_limited
          - reference_asset_failed
          - reference_asset_pending
          - reference_combination_not_supported
          - reference_rejected
          - reference_upload_invalid
          - reference_upload_not_found
          - reference_upload_unusable
          - resolution_not_supported
          - response_format_not_supported
          - schema_missing
          - scope_missing
          - storage_not_configured
          - upload_id_invalid
          - upload_in_use
          - upload_invalid
          - upload_not_found
          - upload_state_error
          - upload_too_large
          - video_edit_model_not_supported
          - video_edit_source_must_be_video
          - video_edit_source_not_found
          - video_edit_source_required
          - voice_not_found
          - voice_required
        error:
          type: string
          description: Human-readable message.
      additionalProperties: true
    UploadCreateResponse:
      type: object
      properties:
        upload_id:
          type: string
          description: workspace-scoped upload id; use this in generation references
        direct_upload_url:
          type: string
          description: RECOMMENDED. Absolute presigned TOS URL, PUT the raw bytes straight here (bypasses the ~4.5MB proxy cap, up to the documented media limits). Send EXACTLY the direct_upload_headers.
        direct_upload_headers:
          type: object
          additionalProperties: true
          description: object of headers that MUST be sent verbatim on the direct_upload_url PUT (Content-Type is signed; a mismatch is rejected by storage)
        direct_upload_expires_at:
          type: string
          description: direct_upload_url expiry (~10 min); request a new upload if it lapses
        complete_url:
          type: string
          description: absolute URL, POST here after the direct_upload_url PUT to finalize and make the upload usable (returns the ready upload_id)
        upload_url:
          type: string
          description: absolute fallback PUT URL for SMALL files only (<~4.5MB), the proxy path; large files MUST use direct_upload_url
        upload_method:
          type: string
          description: PUT
        upload_mode:
          type: string
          description: direct
        expires_at:
          type: string
          description: upload reservation expiry timestamp
      additionalProperties: true
  responses:
    RateLimited:
      description: Too many requests in the window.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
      headers:
        Retry-After:
          schema:
            type: integer
          description: Seconds to wait.
    BadRequest:
      description: 'Invalid request. prompt_required: No prompt (or text for speech) was sent. prompt_too_long: The prompt is over the model''s limit. model_not_found: Unknown model alias. duration_not_supported: The model doesn''t offer that length. aspect_ratio_not_supported: The model doesn''t offer that aspect ratio. resolution_not_supported: The model doesn''t offer that resolution. reference_combination_not_supported: These references can''t be combined, e.g. start/end frames with reference images. upload_invalid: The upload request is missing a field or has a bad type. video_edit_model_not_supported: Video edits need a Seedance 2.0 family model (2.0, Fast or Mini). video_edit_source_required: A video edit needs a source clip. voice_required: Speech needs a voice. audio_reference_too_long: The audio references add up to more than the model accepts in total (15 s on Seedance 2.0, 30 s on 2.5). Nothing was charged. audio_too_short: The voice track is under 4 seconds. Nothing was charged. audio_too_long: The voice track is over 5 minutes. Nothing was charged. audio_unreadable: The audio couldn''t be read. Nothing was charged.'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    NotFound:
      description: 'Not found. job_not_found: No job with that id for this key''s account. character_not_found: The character id or slug doesn''t exist. upload_not_found: The upload_id doesn''t exist in this workspace. reference_upload_not_found: A reference upload_id doesn''t exist in this workspace. video_edit_source_not_found: The source_video_upload_id doesn''t exist. image_upload_not_found: The image_upload_id isn''t in this workspace. audio_upload_not_found: The audio_upload_id isn''t in this workspace (or audio_job_id isn''t a completed /v1/audio job).'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Unauthorized:
      description: 'Missing, wrong or revoked API key. invalid_api_key: The key is missing, wrong or revoked.'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
      headers:
        WWW-Authenticate:
          schema:
            type: string
          description: Bearer challenge (on /v1/mcp).
    Forbidden:
      description: 'Not allowed. account_not_active: The developer account is suspended. scope_missing: The key lacks the scope this endpoint needs. paid_account_required: Lip Sync needs a paid account. Nothing was charged.'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  parameters:
    IdempotencyKey:
      name: Idempotency-Key
      in: header
      required: false
      schema:
        type: string
        maxLength: 255
      description: Send the same key when retrying a create and you get the original job back instead of a second one.
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: Your KreatorFlow API key (kf_...) as a bearer token. Keep it on your server.
    apiKeyHeader:
      type: apiKey
      in: header
      name: x-api-key
      description: Alternative to the Authorization header.
externalDocs:
  description: Developer docs
  url: https://developers.kreatorflow.ai/?section=docs
x-refined-from:
- developers.kreatorflow.ai-openapi.json
- kreatorflow-ai-openapi.json
x-job-error-codes:
- code: reference_rejected
  meaning: A reference did not pass screening.
- code: reference_asset_pending
  meaning: A new reference is still being reviewed.
- code: reference_asset_failed
  meaning: The reference did not pass review.
- code: generation_rejected
  meaning: The request was declined (prompt, reference or options).
- code: generation_timeout
  meaning: The job ran out of time after automatic retries.
- code: generation_unavailable
  meaning: The model is temporarily unavailable.
- code: generation_failed
  meaning: The generation failed.