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-video-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: 3.2.0
info:
title: Kreatorflow Ai Video 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 Video 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: Video
paths:
/v1/videos:
post:
operationId: postVideos
summary: Create a video generation job
description: 'Create a video generation job. Required scope: videos:create. Rate limit: 20 per 60 seconds per account.'
tags:
- Video
x-required-scope: videos:create
parameters:
- $ref: '#/components/parameters/IdempotencyKey'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/VideoRequest'
responses:
'200':
description: Success.
content:
application/json:
schema:
type: object
required:
- success
- data
properties:
success:
type: boolean
const: true
data:
$ref: '#/components/schemas/CreateJobResult'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'402':
$ref: '#/components/responses/InsufficientBalance'
'403':
$ref: '#/components/responses/Forbidden'
'429':
$ref: '#/components/responses/RateLimited'
servers:
- url: https://kreatorflow.ai
description: Production
/v1/video-edits:
post:
operationId: postVideoEdits
summary: Create a Seedance 2 source-video edit job with transform, restyle, or extend…
description: 'Create a Seedance 2 source-video edit job with transform, restyle, or extend mode. Required scope: videos:create. Rate limit: 20 per 60 seconds per account.'
tags:
- Video
x-required-scope: videos:create
parameters:
- $ref: '#/components/parameters/IdempotencyKey'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/VideoEditRequest'
responses:
'200':
description: Success.
content:
application/json:
schema:
type: object
required:
- success
- data
properties:
success:
type: boolean
const: true
data:
$ref: '#/components/schemas/CreateJobResult'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'402':
$ref: '#/components/responses/InsufficientBalance'
'403':
$ref: '#/components/responses/Forbidden'
'429':
$ref: '#/components/responses/RateLimited'
servers:
- url: https://kreatorflow.ai
description: Production
/v1/videos/edit:
post:
operationId: postVideosEdit
summary: Edit one clip on Wan 3.0 by instruction ("make it night", "replace the car with…
description: 'Edit one clip on Wan 3.0 by instruction ("make it night", "replace the car with Image 1"), keeping its length. Up to 4 reference images. The clip must be uploaded first with POST /v1/uploads (public URLs are not accepted). Billed on the clip''s seconds plus the output''s, in whole tokens. Required scope: videos:create. Rate limit: 20 per 60 seconds per account.'
tags:
- Video
x-required-scope: videos:create
parameters:
- $ref: '#/components/parameters/IdempotencyKey'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/VideoToolRequest'
responses:
'200':
description: Success.
content:
application/json:
schema:
type: object
required:
- success
- data
properties:
success:
type: boolean
const: true
data:
$ref: '#/components/schemas/CreateJobResult'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'402':
$ref: '#/components/responses/InsufficientBalance'
'403':
$ref: '#/components/responses/Forbidden'
'429':
$ref: '#/components/responses/RateLimited'
servers:
- url: https://kreatorflow.ai
description: Production
/v1/videos/extend:
post:
operationId: postVideosExtend
summary: Add new footage before, after or on both sides of one clip on Wan 3.0 (at least…
description: 'Add new footage before, after or on both sides of one clip on Wan 3.0 (at least 2 s added; the clip plus the result stay within 30 s). The clip must be uploaded first with POST /v1/uploads (public URLs are not accepted). Billed on the clip''s seconds plus the output''s, in whole tokens. Required scope: videos:create.'
tags:
- Video
x-required-scope: videos:create
parameters:
- $ref: '#/components/parameters/IdempotencyKey'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/VideoToolRequest'
responses:
'200':
description: Success.
content:
application/json:
schema:
type: object
required:
- success
- data
properties:
success:
type: boolean
const: true
data:
$ref: '#/components/schemas/CreateJobResult'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'402':
$ref: '#/components/responses/InsufficientBalance'
'403':
$ref: '#/components/responses/Forbidden'
'429':
$ref: '#/components/responses/RateLimited'
servers:
- url: https://kreatorflow.ai
description: Production
components:
responses:
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'
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'
InsufficientBalance:
description: 'Not enough tokens for the quoted cost; top up and retry. insufficient_balance: Not enough tokens for the quoted cost.'
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).
schemas:
VideoToolRequest:
type: object
properties:
model:
type: string
description: string optional; kreator-video-wan-3-prime or kreator-video-wan-3 (when enabled for your account)
source:
type: string
description: 'required; the clip: an upload_id from POST /v1/uploads (upload_type VIDEO), asset:<id>, generation:<id>, a kreatorflow.ai media link or an @handle. Public URLs are not accepted: upload the clip with POST /v1/uploads first. video / source_video / video_upload_id also accepted. MP4 or MOV, up to 15 s'
instruction:
type: string
description: 'edit: required, what to change (up to 1500 characters); extend: optional, what happens in the new part. prompt / text also accepted. Name references as Image 1, Video 2, Audio 1 or by @handle'
references:
type: array
items:
$ref: '#/components/schemas/Reference'
description: array optional; extra images, clips or audio in the same forms as source (uploaded with POST /v1/uploads, not public URLs), in prompt order after the clip
direction:
type: string
description: 'extend only: after (default), before or both'
add_seconds:
type: string
description: 'extend only: seconds to add, at least 2; the clip plus the result stay within 30 s'
resolution:
type: string
description: 720p (default) or 1080p; anything else is refused with 400 resolution_not_supported before anything is reserved
aspect_ratio:
type: string
description: 'optional; 16:9, 9:16, 1:1, 4:3, 3:4 or 21:9 (default: keep the clip''s shape); anything else is refused with 400 aspect_ratio_not_supported'
seed:
type: integer
description: integer optional
webhook_url:
type: string
format: uri
description: https url optional; receives terminal job callbacks
idempotency_key:
type: string
description: string optional body fallback; prefer Idempotency-Key header
required:
- source
additionalProperties: true
Reference:
type: object
properties:
type:
type: string
enum:
- image_url
- video_url
- audio_url
url:
type: string
description: public https url
upload_id:
type: string
description: workspace-scoped upload_id returned by POST /v1/uploads
role:
type: string
description: optional content role such as first_frame, last_frame, reference_image, reference_video, reference_audio
additionalProperties: true
ContentItem:
type: object
properties:
type:
type: string
enum:
- text
- image_url
- video_url
- audio_url
text:
type: string
description: string when type=text
image_url:
type: string
format: uri
description: https url string or object with url or upload_id when type=image_url
video_url:
type: string
format: uri
description: https url string or object with url or upload_id when type=video_url
audio_url:
type: string
format: uri
description: https url string or object with url or upload_id when type=audio_url
role:
type: string
description: optional role for reference content
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
CreateJobResult:
type: object
properties:
job:
type: string
description: accepted job object; image/character dispatch can continue asynchronously, while video create attempts KreatorFlow dispatch before returning
balance_tokens:
type: number
description: number current developer token balance after reservation or replay
quoted_token_cost:
type: number
description: number token quote for the submitted request
estimated_token_cost:
type: number
description: number compatibility alias for quoted_token_cost
idempotent_replay:
type: boolean
description: boolean optional; true when the same Idempotency-Key returned an existing job instead of creating or dispatching another one
additionalProperties: true
VideoRequest:
type: object
properties:
model:
type: string
description: string optional, defaults to kreator-video-fast; defaults to kreator-video-pro when intent=video_edit
intent:
type: string
description: string optional; set to video_edit for source-video edit mode on /v1/videos
edit_mode:
type: string
description: transform, restyle, or extend when intent=video_edit; editMode alias accepted
source_video_upload_id:
type: string
description: preferred owned same-workspace VIDEO upload_id for source-video edit mode; create it with upload_type VIDEO; MP4/MOV with H.264/AAC under 50 MB recommended; sourceVideoUploadId alias accepted
video:
type: string
description: public HTTPS source video URL alias for source-video edit mode; source_video_url/sourceVideoUrl also accepted
source_video_url:
type: string
description: public HTTPS source video URL alias for source-video edit mode
source_model_key:
type: string
description: optional compatibility hint for previous Seedance 2 sources; omit for newly uploaded source clips
prompt:
type: string
description: string required unless content includes a text item
content:
type: array
items:
$ref: '#/components/schemas/ContentItem'
description: KreatorFlow content array optional
duration:
type: number
description: number optional, rounded up and validated against model limits
aspect_ratio:
type: string
description: string optional; source-video edit defaults to adaptive when omitted
ratio:
type: string
description: alias for aspect_ratio; source-video edit accepts adaptive
resolution:
type: string
description: string optional
generate_audio:
type: boolean
description: boolean optional
watermark:
type: boolean
description: boolean optional, defaults to false
seed:
type: integer
description: integer optional
camera_fixed:
type: boolean
description: boolean optional
references:
type: array
items:
$ref: '#/components/schemas/Reference'
description: array optional; supports url or upload_id
first_frame_upload_id:
type: string
description: image upload_id for the first frame; firstFrameUploadId and first_frame_image_upload_id aliases accepted
last_frame_upload_id:
type: string
description: image upload_id for the last frame; lastFrameUploadId and last_frame_image_upload_id aliases accepted
first_frame_url:
type: string
description: public HTTPS image URL for the first frame; firstFrameUrl and first_frame_image_url aliases accepted
last_frame_url:
type: string
description: public HTTPS image URL for the last frame; lastFrameUrl and last_frame_image_url aliases accepted
reference_upload_ids:
type: array
items:
type: string
description: array optional; image upload_id values
reference_image_upload_ids:
type: array
items:
type: string
description: array optional; image upload_id values
reference_image_urls:
type: array
items:
type: string
description: array optional; public HTTPS image URLs; reference_images/referenceImages also accepted
reference_video_upload_ids:
type: array
items:
type: string
description: array optional; video upload_id values for normal generation clip guidance; source-video edit should use source_video_upload_id
reference_video_urls:
type: array
items:
type: string
description: array optional; public HTTPS video URLs for normal generation clip guidance; reference_videos/referenceVideos also accepted
reference_audio_upload_ids:
type: array
items:
type: string
description: array optional; audio upload_id values
reference_audio_urls:
type: array
items:
type: string
description: array optional; public HTTPS audio URLs; reference_audios/referenceAudios also accepted
character_ids:
type: array
items:
type: string
description: array optional; reusable character ids/slugs from POST /v1/characters mode=register
video_role:
type: string
description: 'string optional, reference (default) or edit, on models whose notes list reference clips: reference uses the clips for style, motion or subject; edit changes the one clip by the prompt and keeps its length and shape'
keep_clip_sound:
type: boolean
description: boolean optional, defaults to true; with video_role edit, keeps the clip's own sound on models that can drop it
shots:
type: array
items:
type: object
required:
- duration
- prompt
properties:
duration:
type: integer
prompt:
type: string
description: 'array optional of { duration, prompt } objects, on models whose notes list a shot list: 2 to 6 shots whose durations add up to duration; prompt then becomes an optional lead-in'
voice_ids:
type: array
items:
type: string
description: array optional; cloned voice ids from GET /v1/voices (cloned:<id>), on models whose notes list voices of their own, named @voice_1.. in the prompt
character_voices:
type: object
additionalProperties: true
description: 'object optional, { character_id: voice id }, on models whose notes list cloned voices: the character (also in character_ids) speaks with that cloned voice'
face_consent:
type: boolean
description: boolean; required (true) when a reference video is combined with image references (a face onto a person); same rules as on POST /v1/video-edits
video_reference_mode:
type: string
description: fallback or strict optional; defaults to fallback for normal generation; source-video edit forces strict
safety_identifier:
type: string
description: string optional, max 64 chars
webhook_url:
type: string
format: uri
description: https url optional; receives terminal job callbacks
callback_url:
type: string
description: alias for webhook_url
idempotency_key:
type: string
description: string optional body fallback; prefer Idempotency-Key header
additionalProperties: true
VideoEditRequest:
type: object
properties:
model:
type: string
description: string optional, defaults to kreator-video-pro; must be a Seedance 2 video alias
edit_mode:
type: string
description: required transform, restyle, or extend; editMode alias accepted
source_video_upload_id:
type: string
description: preferred owned same-workspace VIDEO upload_id from POST /v1/uploads with upload_type VIDEO; image/audio upload ids are rejected before billing; MP4/MOV with H.264/AAC under 50 MB recommended; sourceVideoUploadId alias accepted
video:
type: string
description: public HTTPS source video URL alias; source_video_url/sourceVideoUrl also accepted and normalized through KreatorFlow video storage
source_video_url:
type: string
description: public HTTPS source video URL alias for source-video edit mode
source_model_key:
type: string
description: optional compatibility hint for previous Seedance 2 sources; omit for newly uploaded source clips
prompt:
type: string
description: string required edit instruction for transform/restyle; optional for extend (a default continuation is used)
face_consent:
type: boolean
description: 'boolean; required (true) when image references are sent with the source video (a face onto a person): your confirmation that you are the person in the image or have their permission. Recorded with the job. Face edits also need a paid account and pass a nudity/minor check on the images before anything is charged'
duration:
type: number
description: number optional, rounded up and validated against model limits
aspect_ratio:
type: string
description: string optional; defaults to adaptive to preserve source-video framing
ratio:
type: string
description: alias for aspect_ratio; adaptive preserves source-video framing
resolution:
type: string
description: string optional
generate_audio:
type: boolean
description: boolean optional
character_ids:
type: array
items:
type: string
description: array optional; reusable character ids/slugs from POST /v1/characters mode=register; used as owned/authorized appearance guidance on source-video edits; celebrity, public-figure, deepfake, and impersonation wording is rejected
reference_upload_ids:
type: array
items:
type: string
description: array optional; extra image upload_id values for authorized appearance, style, wardrobe, product, or composition guidance
reference_image_upload_ids:
type: array
items:
type: string
description: array optional; extra image upload_id values for authorized appearance, style, wardrobe, product, or composition guidance
reference_image_urls:
type: array
items:
type: string
description: array optional; extra public HTTPS image URLs for authorized appearance, style, wardrobe, product, or composition guidance; reference_images/referenceImages also accepted
reference_video_upload_ids:
type: array
items:
type: string
description: array optional; extra clip guidance; source_video_upload_id or video/source_video_url is always strict and required
reference_audios:
type: array
items:
type: string
description: array optional; public HTTPS audio reference URLs; equivalent to reference_audio_urls
safety_identifier:
type: string
description: string optional, max 64 chars
webhook_url:
type: string
format: uri
description: https url optional; receives terminal job callbacks
callback_url:
type: string
description: alias for webhook_url
idempotency_key:
type: string
description: string optional body fallback; prefer Idempotency-Key header
required:
- edit_mode
additionalProperties: true
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.