AutoShort Drafts API

Director mode: agree the script before paying for a render.

Operations 5

POST /api/v1/videos/{id}/revise Change one scene of an existing video (clones it into a new draft) #
POST /api/v1/drafts Create a director-mode draft (free) #
GET /api/v1/drafts/{id} Read a draft (or the submitted video) as scenes, with estimates #
PATCH /api/v1/drafts/{id} Edit, insert, remove or reorder scenes while the draft is still a DRAFT #
POST /api/v1/drafts/{id}/render Approve and render a draft (CHARGES credits) #

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/autoshort-org:autoshort-org-drafts-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

autoshort-org-drafts-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: AutoShort Drafts API
  version: 1.0.0
  summary: Create AI short videos from a topic or a reviewed script, poll them to completion, and read credits.
  description: 'Authenticate every request with an API key: `Authorization: Bearer sk_live_...` (create one in the dashboard). Rendering is asynchronous: POST /api/v1/videos/generate (or render a draft) returns a video id; poll GET /api/v1/videos/{id} every 20-30 seconds until status is COMPLETED or FAILED, or register a webhook for video.completed / video.failed. Every render costs credits; a short balance is refused up front (402 INSUFFICIENT_CREDITS). Nothing in this API buys credits. Exception, no key needed: POST /api/x402/videos buys one video per call with an x402 USDC payment (tag "Pay per call (x402)", only when enabled on the server). Director mode (drafts) lets you agree a script first: creating and editing a draft is free, only POST /api/v1/drafts/{id}/render charges. The same capabilities (plus product ads, image-to-video, series and publishing) are available over MCP at https://autoshort.org/api/mcp (OAuth 2.1 or API key). Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset. Error bodies look like {"error": "...", "code": "..."}; some add top-level fields (see each endpoint). Not covered here: API key management (needs a signed-in dashboard session) and the web-app routes behind the MCP product-ad / image-to-video / chat tools.'
  termsOfService: https://autoshort.org/en/terms
  contact:
    name: AutoShort
    url: https://autoshort.org
servers:
- url: https://autoshort.org
security:
- bearerAuth: []
tags:
- name: Drafts
  description: 'Director mode: agree the script before paying for a render.'
paths:
  /api/v1/videos/{id}/revise:
    post:
      operationId: reviseScene
      tags:
      - Drafts
      summary: Change one scene of an existing video (clones it into a new draft)
      description: Free. Returns a NEW draft with the edit applied; rendering that draft is a separate, separately charged video. Requires the "video:create" API key scope.
      security:
      - bearerAuth: []
      parameters:
      - name: id
        in: path
        required: true
        description: Id of the video to revise.
        schema:
          type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ReviseSceneRequest'
      responses:
        '201':
          description: A new draft.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DraftView'
        '400':
          description: INVALID_INPUT (scene number out of range, nothing to change) or CONTENT_POLICY (refused by content safety).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Missing or invalid API key (code UNAUTHORIZED).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: The key lacks the required scope (code INSUFFICIENT_SCOPE; details.manageKeysUrl says where to make a new key) or the IP is not allowlisted.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: VIDEO_NOT_FOUND.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '409':
          description: 'USE_UPDATE_DRAFT (it is still a draft: use PATCH /api/v1/drafts/{id}) or NO_SCENES.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '423':
          description: 'CONTENT_HOLD: the account is on a content-safety hold or suspended.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: 'Per-key hourly rate limit exceeded (code RATE_LIMIT_EXCEEDED, Retry-After header). Endpoints that can spend credits can also answer 429 DAILY_SPEND_CAP_EXCEEDED: the key''s daily agent spending cap is reached, nothing was started or charged; the body has dailyCreditCap, spentToday, creditsNeeded and resetsInSeconds (the cap resets at 00:00 UTC).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '503':
          description: 'CONTENT_CHECK_UNAVAILABLE: the safety check could not run, so the request fails closed (retryable: true). Nothing was charged.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /api/v1/drafts:
    post:
      operationId: createDraft
      tags:
      - Drafts
      summary: Create a director-mode draft (free)
      description: 'From scenes[] it is free and verbatim: the narration is read exactly as written. From a brief it uses one AI call (needs a positive balance; at most 20 per hour per account). Limits: at most 12 scenes, 1000 narration characters per scene, 3000 in total, and an estimated speaking time of at most 150 seconds. Never charges credits; the draft reports estimatedCredits. Requires the "video:create" API key scope.'
      security:
      - bearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateDraftRequest'
      responses:
        '201':
          description: The draft.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DraftView'
        '400':
          description: INVALID_INPUT, NARRATION_TOO_LONG, UNFILLED_PLACEHOLDER_SCENES or CONTENT_POLICY.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Missing or invalid API key (code UNAUTHORIZED).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '402':
          description: 'INSUFFICIENT_CREDITS: drafting from a brief needs a positive balance (scenes[] is free).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: The key lacks the required scope (code INSUFFICIENT_SCOPE; details.manageKeysUrl says where to make a new key) or the IP is not allowlisted.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '423':
          description: 'CONTENT_HOLD: the account is on a content-safety hold or suspended.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: 'RATE_LIMIT_EXCEEDED: either the key''s hourly request limit or the 20 brief drafts per hour per account.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '502':
          description: 'GENERATION_FAILED: the script writer returned no scenes; try again.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '503':
          description: 'CONTENT_CHECK_UNAVAILABLE: the safety check could not run, so the request fails closed (retryable: true). Nothing was charged.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /api/v1/drafts/{id}:
    get:
      operationId: getDraft
      tags:
      - Drafts
      summary: Read a draft (or the submitted video) as scenes, with estimates
      description: Free. Requires the "video:read" API key scope.
      security:
      - bearerAuth: []
      parameters:
      - name: id
        in: path
        required: true
        description: Draft id.
        schema:
          type: string
      responses:
        '200':
          description: The draft.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DraftView'
        '401':
          description: Missing or invalid API key (code UNAUTHORIZED).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: The key lacks the required scope (code INSUFFICIENT_SCOPE; details.manageKeysUrl says where to make a new key) or the IP is not allowlisted.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: DRAFT_NOT_FOUND.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: 'Per-key hourly rate limit exceeded (code RATE_LIMIT_EXCEEDED, Retry-After header). Endpoints that can spend credits can also answer 429 DAILY_SPEND_CAP_EXCEEDED: the key''s daily agent spending cap is reached, nothing was started or charged; the body has dailyCreditCap, spentToday, creditsNeeded and resetsInSeconds (the cap resets at 00:00 UTC).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
    patch:
      operationId: updateDraft
      tags:
      - Drafts
      summary: Edit, insert, remove or reorder scenes while the draft is still a DRAFT
      description: Free. Scene numbers in edits, reorder, remove and insert all refer to the draft as it is before this call. Requires the "video:create" API key scope.
      security:
      - bearerAuth: []
      parameters:
      - name: id
        in: path
        required: true
        description: Draft id.
        schema:
          type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateDraftRequest'
      responses:
        '200':
          description: The updated draft.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DraftView'
        '400':
          description: INVALID_INPUT, NARRATION_TOO_LONG, UNFILLED_PLACEHOLDER_SCENES or CONTENT_POLICY.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Missing or invalid API key (code UNAUTHORIZED).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: The key lacks the required scope (code INSUFFICIENT_SCOPE; details.manageKeysUrl says where to make a new key) or the IP is not allowlisted.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: DRAFT_NOT_FOUND.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '409':
          description: NOT_A_DRAFT (already submitted), DRAFT_CHANGED (edited concurrently; fetch it again) or UGC_VARIANT_LOCKED.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '423':
          description: 'CONTENT_HOLD: the account is on a content-safety hold or suspended.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: 'Per-key hourly rate limit exceeded (code RATE_LIMIT_EXCEEDED, Retry-After header). Endpoints that can spend credits can also answer 429 DAILY_SPEND_CAP_EXCEEDED: the key''s daily agent spending cap is reached, nothing was started or charged; the body has dailyCreditCap, spentToday, creditsNeeded and resetsInSeconds (the cap resets at 00:00 UTC).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '503':
          description: 'CONTENT_CHECK_UNAVAILABLE: the safety check could not run, so the request fails closed (retryable: true). Nothing was charged.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /api/v1/drafts/{id}/render:
    post:
      operationId: renderDraft
      tags:
      - Drafts
      summary: Approve and render a draft (CHARGES credits)
      description: 'Charges the ledger atomically before any paid work. A draft renders once: calling it again returns the first submission with alreadySubmitted true and creditsCharged 0, whatever idempotencyKey you pass (the key is only recorded). Subject to the key''s daily agent spending cap (429 DAILY_SPEND_CAP_EXCEEDED). Only call after the user approved the draft and the price. Requires the "video:create" API key scope.'
      security:
      - bearerAuth: []
      parameters:
      - name: id
        in: path
        required: true
        description: Draft id.
        schema:
          type: string
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                idempotencyKey:
                  type: string
                  maxLength: 200
                  description: Recorded with the render; a second render of the same draft is already a no-op.
      responses:
        '200':
          description: Already submitted earlier; nothing charged now.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RenderDraftResponse'
        '202':
          description: Submitted for rendering (this call charged).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RenderDraftResponse'
        '400':
          description: CONTENT_POLICY (the draft text was refused by content safety; nothing charged) or INVALID_INPUT.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Missing or invalid API key (code UNAUTHORIZED).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '402':
          description: 'INSUFFICIENT_CREDITS (details: creditsAvailable, creditsNeeded, topUpUrl).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: The key lacks the required scope (code INSUFFICIENT_SCOPE; details.manageKeysUrl says where to make a new key) or the IP is not allowlisted.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: DRAFT_NOT_FOUND.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '409':
          description: DRAFT_CHANGED (edited while render was requested; fetch it and retry) or UGC_VARIANT_LOCKED.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '423':
          description: 'CONTENT_HOLD: the account is on a content-safety hold or suspended.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: 'Per-key hourly rate limit exceeded (code RATE_LIMIT_EXCEEDED, Retry-After header). Endpoints that can spend credits can also answer 429 DAILY_SPEND_CAP_EXCEEDED: the key''s daily agent spending cap is reached, nothing was started or charged; the body has dailyCreditCap, spentToday, creditsNeeded and resetsInSeconds (the cap resets at 00:00 UTC).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '503':
          description: 'CONTENT_CHECK_UNAVAILABLE: the safety check could not run, so the request fails closed (retryable: true). Nothing was charged.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  schemas:
    DraftSceneInput:
      type: object
      required:
      - narration
      properties:
        narration:
          type: string
          maxLength: 1000
          description: Exactly what the voice reads for this scene. Read verbatim, never rewritten.
        visual:
          type:
          - string
          - 'null'
          maxLength: 600
          description: What the viewer sees; becomes the image prompt plus the art style. Omit to let AutoShort pick.
        seconds:
          type:
          - number
          - 'null'
          minimum: 1
          maximum: 30
          description: Optional scene length in seconds.
        imageFile:
          type:
          - string
          - 'null'
          description: File name of an image you already ingested through MCP (scenes[].image_url); not a URL.
    DraftView:
      type: object
      properties:
        draftId:
          type: string
        status:
          type: string
        title:
          type: string
        language:
          type: string
        artStyle:
          type: string
        aspectRatio:
          type:
          - string
          - 'null'
        targetDuration:
          type:
          - integer
          - 'null'
        estimatedDurationSeconds:
          type: number
        estimatedCredits:
          type: integer
          description: What rendering this draft will cost.
        narrationIsVerbatim:
          type: boolean
          const: true
        scenes:
          type: array
          items:
            type: object
            properties:
              scene:
                type: integer
              narration:
                type: string
              visual:
                type:
                - string
                - 'null'
              seconds:
                type: number
              words:
                type: integer
              estimatedSeconds:
                type: number
              imageSource:
                type: string
              autoImagePrompt:
                type: string
        warnings:
          type: array
          items:
            type: object
            properties:
              code:
                type: string
                enum:
                - DURATION_MISMATCH
                - SCENE_TIMING
                - LONG_NARRATION
              message:
                type: string
              scene:
                type: integer
              suggestedWords:
                type: integer
        nextStep:
          type: string
    RenderDraftResponse:
      type: object
      required:
      - videoId
      - status
      - submitted
      - creditsCharged
      properties:
        videoId:
          type: string
          description: Poll GET /api/v1/videos/{videoId}.
        status:
          type: string
        submitted:
          type: boolean
          description: False when this was a repeat of an earlier submission (nothing charged now).
        alreadySubmitted:
          type: boolean
        creditsCharged:
          type: integer
          description: Credits charged by THIS call (0 on a repeat).
        warnings:
          type: array
          items:
            type: object
            additionalProperties: true
        message:
          type: string
    CreateDraftRequest:
      type: object
      description: Give either scenes[] (free, verbatim, at most 12) or a brief (one AI call).
      properties:
        scenes:
          type: array
          maxItems: 12
          items:
            $ref: '#/components/schemas/DraftSceneInput'
        brief:
          type: string
          description: A brief for AutoShort to write the scenes from.
        title:
          type: string
          maxLength: 100
        targetDuration:
          type: integer
          minimum: 8
          maximum: 90
        aspectRatio:
          type: string
          enum:
          - '9:16'
          - '1:1'
          - '16:9'
        language:
          type: string
        artStyle:
          type: string
          enum:
          - AUTOSHORTS
          - LEGO
          - COMIC_BOOK
          - DISNEY_TOON
          - STUDIO_GHIBLI
          - PIXEL_ART
          - WATERCOLOR
          - OIL_PAINTING
          - CYBERPUNK
          - FANTASY
          - ANIME
          - STICKMAN
    UpdateDraftRequest:
      type: object
      properties:
        edits:
          type: array
          items:
            type: object
            required:
            - scene
            properties:
              scene:
                type: integer
                description: 1-based scene number.
              narration:
                type: string
                maxLength: 1000
              visual:
                type:
                - string
                - 'null'
                maxLength: 600
              seconds:
                type:
                - number
                - 'null'
                minimum: 1
                maximum: 30
        insert:
          type: array
          items:
            type: object
            required:
            - after
            - narration
            properties:
              after:
                type: integer
                description: Insert after this scene number (0 = at the start).
              narration:
                type: string
                maxLength: 1000
              visual:
                type:
                - string
                - 'null'
                maxLength: 600
              seconds:
                type:
                - number
                - 'null'
                minimum: 1
                maximum: 30
        remove:
          type: array
          items:
            type: integer
          description: Scene numbers to remove.
        reorder:
          type: array
          items:
            type: integer
          description: New order as scene numbers.
        title:
          type: string
          maxLength: 100
        targetDuration:
          type:
          - integer
          - 'null'
        aspectRatio:
          type: string
          enum:
          - '9:16'
          - '1:1'
          - '16:9'
        language:
          type: string
        artStyle:
          type: string
          enum:
          - AUTOSHORTS
          - LEGO
          - COMIC_BOOK
          - DISNEY_TOON
          - STUDIO_GHIBLI
          - PIXEL_ART
          - WATERCOLOR
          - OIL_PAINTING
          - CYBERPUNK
          - FANTASY
          - ANIME
          - STICKMAN
    Error:
      type: object
      required:
      - error
      properties:
        error:
          type: string
          description: Human-readable message.
        code:
          type: string
          description: Stable machine-readable code, e.g. INSUFFICIENT_CREDITS.
        details:
          type: object
          additionalProperties: true
    ReviseSceneRequest:
      type: object
      required:
      - scene
      properties:
        scene:
          type: integer
          description: 1-based scene number to change.
        narration:
          type: string
          maxLength: 1000
        visual:
          type:
          - string
          - 'null'
          maxLength: 600
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: API key (sk_live_...)
      description: AutoShort API key. Create one in the dashboard; pick the scopes the endpoints below ask for.
externalDocs:
  description: Developer portal
  url: https://autoshort.org/en/developers