Cut.ProDocs

Clip a video

Analyze the link, create the submission, follow the states and work with the clips the AI generated.

Clipping has three resources: the video (the source), the submission (one processing run of that video) and the clips (the cuts the submission generated). A video can have several submissions, for example with different sections or templates.

POST /clips/info  →  POST /clips  →  GET .../submissions/{id}  →  GET .../clips
   analysis          submission         until completed             the cuts
curl -X POST https://api.cut.pro/api/v1/clips/info \
  -H "X-Api-Key: $CUTPRO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ" }'

The response carries the title, author, platform, duration in seconds, thumbnail and the cost in credits. Analyzing does not charge, but it has its own limit of 10 per minute. If you have the file, use the upload in place of this step.

When the link does not work, the code says why:

StatusCodesMeans
400VIDEO_TOO_LONGExceeds the plan's maximum duration. extra.duration and extra.max_duration say by how much.
403PRIVATE_VIDEO, AGE_RESTRICTED, ACCESS_DENIED, REGION_BLOCKED, COPYRIGHT_BLOCKED, PLATFORM_NOT_SUPPORTEDThe platform does not deliver this video.
404VIDEO_ID_NOT_FOUND, UNAVAILABLE, METADATA_UNAVAILABLEThe video does not exist or was taken down.
422PLAYLIST_URL, CHANNEL_URL, SHORTS_NOT_SUPPORTED, LIVE_STREAM, PREMIUM_ONLY, AUDIO_ONLY, INVALID_URL, INVALID_DURATION, INVALID_DIMENSIONSThe link is valid, but it is not a video that can be clipped.

Create the submission

curl -X POST https://api.cut.pro/api/v1/clips \
  -H "X-Api-Key: $CUTPRO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "video_id": "7412908365112823",
    "source_language": "pt",
    "timeframe": { "start": 600, "end": 1800 },
    "template_id": "7398110254410021"
  }'
FieldRequiredDescription
video_idyesThe id from POST /clips/info or from the upload.
source_languagenoauto (default), pt or en. Set it when you know: it is more accurate.
timeframeno{ start, end } in seconds. Clips only that section.
template_idnoA template from GET /templates. Every clip comes out edited with it, ready to render.
translate_tonoISO 639-1 code (en, es). Translates the clips' captions and costs more.
strategy_idnoA clipping strategy saved in Cut.Pro. Without it, the AI uses the default configuration.

Credits are charged on creation. credits_charged in the response says how much was charged.

Common errors on creation: 402 INSUFFICIENT_CREDITS, 409 VIDEO_ALREADY_PROCESSING (the same video is already processing), 429 TOO_MANY_PENDING_CLIPS (workspace queue full), 400 TIMEFRAME_OUT_OF_BOUNDS and 400 TIMEFRAME_TOO_SHORT.

Follow the submission

curl https://api.cut.pro/api/v1/clips/7412908365112823/submissions/7412908371004912 \
  -H "X-Api-Key: $CUTPRO_API_KEY"

Poll every 5 to 10 seconds. The states follow this order:

statusWhat is happening
queuedIn the queue. queue_position and estimated_time (in seconds) say how long is left.
downloadingDownloading the source.
transcribingTranscribing the audio.
video_analysisAnalyzing the image.
analyzingThe AI is choosing the moments.
finalizingGenerating the clips.
completedDone. clips_count says how many clips came out.
failedFailed. The reason is in error_code.

A source that is not live yet

A submission can stop at downloading because the source does not fully exist yet: a scheduled premiere, a live stream still on air or a recording the platform is still processing. In that case waiting_reason is filled in:

waiting_reasonMeans
SOURCE_PREMIERE_SCHEDULEDScheduled premiere. waiting_until carries the announced time, when the platform provides it.
SOURCE_LIVE_IN_PROGRESSThe live stream is still on air.
SOURCE_VOD_PROCESSINGThe broadcast ended and the platform is still preparing the recording.

It is not an error and it is not stuck: the submission continues on its own when the source becomes available. Show this to the person and offer to cancel, because DELETE in this state returns the credits.

When it fails

error_code says the reason. Those that start with DOWNLOAD_ come from the source (DOWNLOAD_PRIVATE_VIDEO, DOWNLOAD_MEMBERS_ONLY, DOWNLOAD_GEO_RESTRICTED, DOWNLOAD_REMOVED_BY_UPLOADER): switching to another video is the way out. EMPTY_TRANSCRIPT and DOWNLOAD_NO_AUDIO say there is no speech to clip. The rest are processing failures and are worth another attempt:

curl -X POST https://api.cut.pro/api/v1/clips/7412908365112823/submissions/7412908371004912/retry \
  -H "X-Api-Key: $CUTPRO_API_KEY"

The retry creates a new submission with the same settings and charges like POST /clips. The one that failed stays in the history. It only works for a submission in failed: for the others, the response is 409 SUBMISSION_NOT_FAILED.

List the clips

curl "https://api.cut.pro/api/v1/clips/7412908365112823/submissions/7412908371004912/clips?min_rating=7&sort=rating&order=desc" \
  -H "X-Api-Key: $CUTPRO_API_KEY"
200 OK
{
  "clips": [
    {
      "id": "7412908412887301",
      "title": "The chorus everyone knows",
      "description": "The highest-energy moment of the video, with the audience singing along.",
      "rating": 9.2,
      "start_time": 42.5,
      "end_time": 71.0,
      "language": "en",
      "created_at": "2026-10-29T18:04:50.000Z",
      "thumbnail_url": "https://...",
      "download_url": "https://...",
      "play_url": "https://...",
      "has_template_applied": false,
      "edit_id": null
    }
  ],
  "pagination": { "current_page": 1, "total_pages": 1, "total_count": 6, "has_next_page": false, "has_previous_page": false, "limit": 20 }
}
  • rating goes from 0 to 10. Filter with min_rating and max_rating.
  • Sort by rating, duration, title or start_time.
  • download_url is the raw cut, with no editing. For the MP4 with template and captions, render it.
  • The links are signed and short-lived. Ask for the list again when you are going to use it.

Clip captions

curl "https://api.cut.pro/api/v1/clips/7412908365112823/submissions/7412908371004912/clips/7412908412887301/subtitles?format=srt" \
  -H "X-Api-Key: $CUTPRO_API_KEY"

Returns SRT or plain text (format=txt), with time starting at 00:00 and aligned to the clip. If the clip has an edit, the captions are the edit's, with corrections and translation.

Retention

A submission's clips do not stay forever. Once retention passes, the submission shows expired: true and the clip routes respond 410 SUBMISSION_EXPIRED. It is permanent: do not retry, upload the video again. What you already rendered is still recoverable by the edit_id.

Organize the library

RouteWhat it does
GET /clipsLists the videos, with counters for clips, edits, exports and posts and the state of the last submission.
GET /clips/{videoId}/submissionsLists a video's submissions, with credit_cost, timeframe and expired.
DELETE /clips/{videoId}/submissions/{submissionId}Deletes the submission and the clips. If it is still processing, it cancels and returns the credits.
DELETE /clips/{videoId}/submissions/{submissionId}/clips/{clipId}Deletes one clip.
DELETE /clips/{videoId}Deletes the video with all its submissions. Those processing are canceled and refunded.

Deleting cannot be undone.

On this page