Skip to main content

The Video Clipping API

Cut clips from any video URL with one API call. Try it below.

Note: Some YouTube URLs may be blocked by YouTube and can return a 422 error.

Loading video info…

Clip Studio

: :
: :

Duration:

GIF limited to 30s (current: )

Checked downloads appear in History and get a share page link. Unchecked downloads stay out of History.

Get the full transcript with timestamps. YouTube only. Returns instantly.

Cost
Download Process Upload Done

Get $5 free to test when you sign up

Dead simple to integrate

Works with any programming language. Here are a few examples.

# Clip a video with one API call
import requests, time

headers = {"Authorization": "Bearer sk_live_..."}
clip = requests.post(
    "https://api.fastclip.dev/v1/clip",
    headers=headers,
    json={
        "url": "https://youtube.com/watch?v=dQw4w9WgXcQ",
        "start": 30,
        "end": 90,
        "format": "mp4",
        "quality": "1080p"
    }
).json()

# Poll until ready
while True:
    r = requests.get(f"https://api.fastclip.dev/v1/clip/{clip['job_id']}", headers=headers).json()
    if r["status"] == "complete":
        print(r["download_url"])
        break
    time.sleep(2)
// Clip a video with one API call
const response = await fetch(
  "https://api.fastclip.dev/v1/clip", {
    method: "POST",
    headers: {
      "Authorization": "Bearer sk_live_...",
      "Content-Type": "application/json"
    },
    body: JSON.stringify({
      url: "https://youtube.com/watch?v=dQw4w9WgXcQ",
      start: 30, end: 90,
      format: "mp4", quality: "1080p"
    })
  }
);
const clip = await response.json();

// Poll until ready
while (true) {
  const r = await fetch(
    `https://api.fastclip.dev/v1/clip/${clip.job_id}`,
    { headers: { "Authorization": "Bearer sk_live_..." } }
  ).then(r => r.json());
  if (r.status === "complete") { console.log(r.download_url); break; }
  await new Promise(r => setTimeout(r, 2000));
}
# Clip a video with one API call
JOB=$(curl -s -X POST https://api.fastclip.dev/v1/clip \
  -H "Authorization: Bearer sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://youtube.com/watch?v=dQw4w9WgXcQ",
    "start": 30, "end": 90,
    "format": "mp4", "quality": "1080p"
  }')
JOB_ID=$(echo $JOB | grep -o '"job_id":"[^"]*"' | cut -d'"' -f4)

# Poll until ready
while true; do
  sleep 2
  STATUS=$(curl -s https://api.fastclip.dev/v1/clip/$JOB_ID \
    -H "Authorization: Bearer sk_live_...")
  echo $STATUS | grep -q '"complete"' && break
done
echo $STATUS
// Clip a video with one API call
package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "net/http"
    "time"
)

func main() {
    auth := "Bearer sk_live_..."
    body, _ := json.Marshal(map[string]any{
        "url":     "https://youtube.com/watch?v=dQw4w9WgXcQ",
        "start":   30,
        "end":     90,
        "format":  "mp4",
        "quality": "1080p",
    })

    req, _ := http.NewRequest("POST",
        "https://api.fastclip.dev/v1/clip",
        bytes.NewBuffer(body))
    req.Header.Set("Authorization", auth)
    req.Header.Set("Content-Type", "application/json")

    resp, _ := http.DefaultClient.Do(req)
    defer resp.Body.Close()
    var clip map[string]any
    json.NewDecoder(resp.Body).Decode(&clip)

    // Poll until ready
    for {
        time.Sleep(2 * time.Second)
        req, _ := http.NewRequest("GET",
            fmt.Sprintf("https://api.fastclip.dev/v1/clip/%s", clip["job_id"]), nil)
        req.Header.Set("Authorization", auth)
        resp, _ := http.DefaultClient.Do(req)
        var r map[string]any
        json.NewDecoder(resp.Body).Decode(&r)
        resp.Body.Close()
        if r["status"] == "complete" {
            fmt.Println(r["download_url"])
            break
        }
    }
}
# Clip a video with one API call
require "net/http"
require "json"
require "uri"

uri = URI("https://api.fastclip.dev/v1/clip")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true

request = Net::HTTP::Post.new(uri)
request["Authorization"] = "Bearer sk_live_..."
request["Content-Type"] = "application/json"
request.body = {
  url: "https://youtube.com/watch?v=dQw4w9WgXcQ",
  start: 30, end: 90,
  format: "mp4", quality: "1080p"
}.to_json

response = http.request(request)
clip = JSON.parse(response.body)
job_id = clip["job_id"]

# Poll until ready
loop do
  sleep 2
  poll = Net::HTTP::Get.new(URI("https://api.fastclip.dev/v1/clip/#{job_id}"))
  poll["Authorization"] = "Bearer sk_live_..."
  r = JSON.parse(http.request(poll).body)
  if r["status"] == "complete"
    puts r["download_url"]
    break
  end
end
// Clip a video with one API call
$response = file_get_contents(
    "https://api.fastclip.dev/v1/clip",
    false,
    stream_context_create([
        "http" => [
            "method" => "POST",
            "header" => implode("\r\n", [
                "Authorization: Bearer sk_live_...",
                "Content-Type: application/json"
            ]),
            "content" => json_encode([
                "url"     => "https://youtube.com/watch?v=dQw4w9WgXcQ",
                "start"   => 30,
                "end"     => 90,
                "format"  => "mp4",
                "quality" => "1080p"
            ])
        ]
    ])
);

$clip = json_decode($response, true);

// Poll until ready
$ctx = stream_context_create(["http" => [
    "header" => "Authorization: Bearer sk_live_..."
]]);
do {
    sleep(2);
    $r = json_decode(file_get_contents(
        "https://api.fastclip.dev/v1/clip/" . $clip["job_id"],
        false, $ctx
    ), true);
} while ($r["status"] !== "complete");
echo $r["download_url"];

Auto-reload via API

Top up your balance programmatically with a saved card. Enable in Settings → API Reload.

# Check balance, list cards, then reload
import requests

headers = {"Authorization": "Bearer sk_live_..."}

# 1. Check current balance
bal = requests.get("https://api.fastclip.dev/v1/balance", headers=headers).json()
print(f"Balance: ${bal['balance']:.2f}")

# 2. List saved cards
cards = requests.get("https://api.fastclip.dev/v1/cards", headers=headers).json()
for c in cards["cards"]:
    print(f"  {c['brand']} ****{c['last4']}")

# 3. Reload $25 with saved card
reload = requests.post("https://api.fastclip.dev/v1/reload",
    headers=headers,
    json={"amount": 2500}  # cents
).json()

print(f"New balance: ${reload['balance']:.2f}")
# → New balance: $29.90
// Check balance, list cards, then reload
const headers = {
  "Authorization": "Bearer sk_live_...",
  "Content-Type": "application/json"
};

// 1. Check current balance
const bal = await fetch("https://api.fastclip.dev/v1/balance", { headers })
  .then(r => r.json());
console.log(`Balance: $${bal.balance.toFixed(2)}`);

// 2. List saved cards
const cards = await fetch("https://api.fastclip.dev/v1/cards", { headers })
  .then(r => r.json());
cards.cards.forEach(c => console.log(`  ${c.brand} ****${c.last4}`));

// 3. Reload $25 with saved card
const reload = await fetch("https://api.fastclip.dev/v1/reload", {
  method: "POST", headers,
  body: JSON.stringify({ amount: 2500 })  // cents
}).then(r => r.json());

console.log(`New balance: $${reload.balance.toFixed(2)}`);
// → New balance: $29.90
# 1. Check current balance
curl https://api.fastclip.dev/v1/balance \
  -H "Authorization: Bearer sk_live_..."

# 2. List saved cards
curl https://api.fastclip.dev/v1/cards \
  -H "Authorization: Bearer sk_live_..."

# 3. Reload $25 with saved card
curl -X POST https://api.fastclip.dev/v1/reload \
  -H "Authorization: Bearer sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{"amount": 2500}'

# → {"success":true,"balance":29.90,...}
// Check balance, list cards, then reload
package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "io"
    "net/http"
)

func apiGet(url, auth string) map[string]any {
    req, _ := http.NewRequest("GET", url, nil)
    req.Header.Set("Authorization", auth)
    resp, _ := http.DefaultClient.Do(req)
    defer resp.Body.Close()
    var out map[string]any
    json.NewDecoder(resp.Body).Decode(&out)
    return out
}

func main() {
    auth := "Bearer sk_live_..."

    // 1. Check balance
    bal := apiGet("https://api.fastclip.dev/v1/balance", auth)
    fmt.Printf("Balance: $%.2f\n", bal["balance"])

    // 2. List saved cards
    cards := apiGet("https://api.fastclip.dev/v1/cards", auth)
    for _, c := range cards["cards"].([]any) {
        card := c.(map[string]any)
        fmt.Printf("  %s ****%s\n", card["brand"], card["last4"])
    }

    // 3. Reload $25
    body, _ := json.Marshal(map[string]any{"amount": 2500})
    req, _ := http.NewRequest("POST",
        "https://api.fastclip.dev/v1/reload",
        bytes.NewBuffer(body))
    req.Header.Set("Authorization", auth)
    req.Header.Set("Content-Type", "application/json")

    resp, _ := http.DefaultClient.Do(req)
    defer resp.Body.Close()
    out, _ := io.ReadAll(resp.Body)
    fmt.Println(string(out))
    // → {"success":true,"balance":29.90,...}
}
# Check balance, list cards, then reload
require "net/http"
require "json"

http = Net::HTTP.new("api.fastclip.dev", 443)
http.use_ssl = true
auth = "Bearer sk_live_..."

# 1. Check balance
req = Net::HTTP::Get.new("/v1/balance")
req["Authorization"] = auth
bal = JSON.parse(http.request(req).body)
puts "Balance: $#{'%.2f' % bal['balance']}"

# 2. List saved cards
req = Net::HTTP::Get.new("/v1/cards")
req["Authorization"] = auth
cards = JSON.parse(http.request(req).body)
cards["cards"].each { |c| puts "  #{c['brand']} ****#{c['last4']}" }

# 3. Reload $25
req = Net::HTTP::Post.new("/v1/reload")
req["Authorization"] = auth
req["Content-Type"] = "application/json"
req.body = { amount: 2500 }.to_json
reload = JSON.parse(http.request(req).body)

puts "New balance: $#{'%.2f' % reload['balance']}"
# → New balance: $29.90
// Check balance, list cards, then reload
$auth = "Authorization: Bearer sk_live_...";

// 1. Check balance
$bal = json_decode(file_get_contents(
    "https://api.fastclip.dev/v1/balance", false,
    stream_context_create(["http" => ["header" => $auth]])
), true);
echo "Balance: $" . number_format($bal["balance"], 2) . "\n";

// 2. List saved cards
$cards = json_decode(file_get_contents(
    "https://api.fastclip.dev/v1/cards", false,
    stream_context_create(["http" => ["header" => $auth]])
), true);
foreach ($cards["cards"] as $c) {
    echo "  {$c['brand']} ****{$c['last4']}\n";
}

// 3. Reload $25 with saved card
$r = json_decode(file_get_contents(
    "https://api.fastclip.dev/v1/reload", false,
    stream_context_create(["http" => [
        "method" => "POST",
        "header" => implode("\r\n", [
            $auth,
            "Content-Type: application/json"
        ]),
        "content" => json_encode(["amount" => 2500])
    ]])
), true);

echo "New balance: $" . number_format($r["balance"], 2);
// → New balance: $29.90

Let AI do the clipping

Don't know the timestamps? Just describe what you want and our AI finds and clips the right moments.

1. Describe

Tell us what you're looking for in plain English. "The part about machine learning" or "when the host laughs."

2. AI Analyzes

Our AI processes the video's content, using transcripts for YouTube or audio analysis for other sites, to find matching moments.

3. Get Clips

Multiple matching segments? You get multiple clips. Each additional segment is just $0.10 extra. Download them all instantly.

Example Request

POST /v1/clip/auto { "url": "https://youtube.com/watch?v=...", "query": "the part about neural networks", "format": "mp4", "quality": "1080p" }

Analyze Only: from $0.10

Just want the timestamps? The /v1/clip/analyze endpoint returns matching segments with confidence scores and transcript excerpts when available. No output clip is rendered, and no format or quality is needed.

POST /v1/clip/analyze { "url": "https://youtube.com/watch?v=...", "query": "all mentions of machine learning" } // Response: { "segments": [{ "start": 45, "end": 112, "excerpt": "...where machine learning really changed the game...", "confidence": 0.92 }], "cost": 0.10 }

Pair with POST /v1/clip to clip only the segments you want.

3-step workflow

How it works

FastClip turns one API call into a finished asset. Send the source, let us handle the video work, and get back a ready-to-use file link for your app or workflow.

Step 1
1

Send the clip job

POST the source URL, timestamps or AI prompt, and the output format you want.

You send

URL + start/end or prompt + format

Step 2
2

We fetch and process

FastClip downloads the source, trims the target segment, and encodes the final output on our servers.

We handle

Download, trim, encode, and delivery

Step 3
3

Get the finished asset

You get a job response plus a hosted file link for the completed MP4, MP3, GIF, or transcript.

You receive

Job status + download URL

Works with YouTube

Coming soon

TikTok X Vimeo Instagram Twitch Kick Facebook Rumble Dailymotion

Pay per clip. No subscriptions.

Deposit funds ($5 minimum), clip videos. Only pay for what you use.

Manual Clip

Set start & end, get your clip

$0.10 /clip
  • YouTube support
  • Set start & end time
  • MP4, MP3, or GIF
  • Up to 4K for MP4
  • GIF stays at 720p / 1080p
  • Max 10 min clip length
True 4K MP4: $0.20/clip
Popular
AI Auto

Describe it, AI finds the moments

$0.20 /hr source
  • Describe what to clip
  • AI finds the moments
  • Multiple clips per job
  • All formats & qualities
  • Up to 3 hr source video
  • +$0.10 / extra segment
  • $0.10/hr analyze-only
True 4K MP4: +$0.10/job
Full Download

Download the complete video

$0.05 /video
  • Download complete video
  • No trimming or cuts
  • MP4 or MP3
  • Up to 4K for MP4
  • No duration limit
True 4K MP4: $0.10/video
Transcript

Full timestamped transcript

$0.02 /video
  • Full video transcript
  • Timestamped segments
  • Machine-readable JSON
  • YouTube support
  • Instant response

4K pricing is based on the quality actually delivered. If a source tops out below 4K, FastClip auto-downgrades and charges the lower tier.

0:03 / 0:20

Get rolled lol

Download
MP4 · 1080p · 9.5 MB · 0:20
Pinned: this clip is permanently stored

Every clip gets a share page.

Each clip you create gets its own shareable link with a built-in video player. Send it to anyone, no login required. Embed it on your site, share on social, or keep it for yourself.

View live example
  • Unique link per clip

    Find every clip under Account → History. Each one has a shareable link.

  • Built-in player

    Video, audio, and GIF clips play directly in the browser. No external player needed.

  • Pin to keep forever

    Clips expire after 24 hours by default. Pin them to store permanently.

  • Embed anywhere

    Copy the embed code to drop clips into blogs, docs, or any website.

API Reference

Base URL

https://api.fastclip.dev/v1

Request

{ "url": "https://youtube.com/watch?v=..." }

Response

{ "title": "Video Title", "duration": 3600.5, "thumbnail": "https://...", "preview_url": null, "preview_embed_url": "https://...", "max_height": 1080 }

No auth required. Use to validate URLs, check duration (for cost estimates), and confirm platform support before clipping.

Request

{ "url": "https://youtube.com/watch?v=...", "start": 120, "end": 180, "format": "mp4", "quality": "4k" }

Response

{ "job_id": "a1b2c3d4e5f6g7h8", "status": "pending" }

quality accepts 720p, 1080p, and 4k for MP4. GIF stays on 720p/1080p. Omit quality for MP3 requests. FastClip auto-downgrades unsupported requests to the highest available quality at or below the request and charges based on the delivered quality.

Request

{ "url": "https://youtube.com/watch?v=...", "query": "the part about neural networks", "format": "mp4", "quality": "4k" }

Response

{ "job_id": "x1y2z3a4b5c6d7e8", "status": "pending", "reserved": 0.30 }

quality accepts 720p, 1080p, and 4k for MP4 auto-clips. GIF stays on 720p/1080p. Omit it for MP3 auto-clip requests. True 4K MP4 auto-clips add a flat $0.10 premium when 4K is actually delivered.

Request

{ "url": "https://youtube.com/watch?v=...", "query": "all mentions of machine learning" }

Response

{ "segments": [{ "start": 45, "end": 112, "excerpt": "...where machine learning really changed the game...", "confidence": 0.92 }], "cost": 0.10 }

From $0.10 (scales with video length). No output clip is rendered. Excerpts contain transcript text when available (and may be empty on some sources). Pair with POST /v1/clip to clip only the segments you want.

Response (complete)

{ "job_id": "a1b2c3d4e5f6g7h8", "status": "complete", "progress": 100, "status_message": "Done!", "download_url": "https://r2.../abc123.mp4", "file_name": "clip_2-00-3-00.mp4", "format": "mp4", "quality": "1080p", "aspect_ratio": "16:9", "saved_to_library": true, "clip_id": "a1b2c3d4e5f6g7h8", "share_url": "/c/a1b2c3d4e5f6g7h8", "embed_url": "/embed/a1b2c3d4e5f6g7h8", "cost": 0.10 }

Status values include pendinganalyzing (auto only) → downloadingprocessing/processing segment N/Muploadingcomplete. On failure: failed with error field. The quality field always reflects the delivered quality, not just the requested one. Auto-clips return a clips array with per-segment download URLs, delivered quality, and, when saved, per-segment share_url/embed_url. Full downloads only include clip_id, share_url, and embed_url when saved_to_library is true.

Video Tools

Request

{ "url": "https://youtube.com/watch?v=...", "format": "mp4", "quality": "4k", "save_to_library": true }

Response

{ "job_id": "a1b2c3d4e5f6g7h8", "status": "pending" }

Starts at $0.05 per download. True 4K MP4 downloads cost $0.10. No duration limit. Poll status via GET /v1/clip/{job_id}. Set format to mp4 or mp3. quality accepts 720p, 1080p, or 4k for MP4 downloads, and the completed job returns the delivered quality after any downgrade. Set save_to_library to true to show the full download in History and generate both a share page URL and an embed URL; omitted or false keeps it out of History.

Request

{ "url": "https://youtube.com/watch?v=..." }

Response

{ "text": "[0:00:00] Hello everyone...", "segments": [{ "start": 0.0, "end": 3.5, "text": "Hello everyone" }], "duration": 3600.5, "cost": 0.02 }

$0.02 per transcript. YouTube only. Returns instantly. Includes timestamped segments and formatted text. Returns 404 if no transcript is available for the video.

Clip Management

Response

{ "clips": [{ "id": "a1b2c3d4e5f6g7h8", "name": "Intro Section", "format": "mp4", "quality": "1080p", "duration": 60, "file_size": 1048576, "pinned": true, "expires_at": "", "hours_left": null, "download_url": "https://r2.../a1b2c3.mp4", "share_url": "/c/a1b2c3d4e5f6g7h8", "embed_url": "/embed/a1b2c3d4e5f6g7h8", "aspect_ratio": "16:9", "source_title": "My Source Video", "created": "2026-03-30T12:00:00Z" }], "page": 1, "per_page": 20, "total_items": 47, "total_pages": 3 }

Paginated, most recent first. Query params: ?page=1&per_page=20. History includes clipped renders plus full downloads saved with save_to_library=true. Saved items expose both share_url and embed_url.

Request

{ "name": "Final Intro Cut" }

Response

{ "id": "a1b2c3d4e5f6g7h8", "name": "Final Intro Cut" }

Response

{ "id": "a1b2c3d4e5f6g7h8", "pinned": true }

Pinned clips count against your storage quota. Returns error if quota exceeded.

Response

{ "id": "a1b2c3d4e5f6g7h8", "pinned": false, "expires_at": "2026-03-31T12:00:00+00:00" }

Response

{ "id": "a1b2c3d4e5f6g7h8", "deleted": true, "storage_freed": 40509 // bytes }

This permanently deletes the clip from storage. This action cannot be undone.

Account

Response

{ "balance": 4.90 }

Response

{ "cards": [{ "id": "pm_1abc123", "brand": "visa", "last4": "4242", "exp_month": 12, "exp_year": 2027, "is_default": true }] }

Listing cards does not require API Reload to be enabled. Use the returned pm_... id with DELETE /v1/cards/{payment_method_id} to remove a saved card.

Request

{ "amount": 2500, // cents ($25) "reload_password": "..." // if set }

Response

{ "success": true, "payment_intent_id": "pi_3T...", "amount": 2500, "balance": 29.90 }

$5–$500 per reload. Rate limit: 10/hour. Requires API Reload enabled in Settings. If email confirmation is on, the immediate response is { "pending": true, "message": "...", "amount": 2500 } and an approval email is sent before any charge.

Authentication

Authorization: Bearer sk_live_...

Generate API keys from your account dashboard. Max 10 keys per account. Most endpoints in this section require auth; POST /v1/clip/info does not.

Rate Limiting

API-key requests: 60 req/min per key. Clip jobs: 20/hour per user. Reloads: 10/hour. Unauthenticated endpoints are IP-limited.

X-RateLimit-Remaining: 8 X-RateLimit-Reset: 1711814400 Retry-After: 42 // on 429 only

Using AI agents?
Give them this URL.

A plain-text reference mirroring the public endpoints and product rules shown on this page. Optimised for LLMs to read and reason about.

https://fastclip.dev/llm.md
View LLM Reference

API Details

Everything else you need to know when integrating.

Error Responses

All errors return JSON with a detail field:

{ "detail": "Insufficient balance" }

400 Bad request

404 Not found

401 Invalid API key

409 Storage quota full

402 Low balance

422 URL unsupported, unavailable, or blocked by YouTube

429 Rate limited (check Retry-After)

Some YouTube URLs may be blocked by YouTube and return 422.

Platforms

youtube.com

More coming soon

Some YouTube URLs may still return 422 when blocked by YouTube.

Formats

mp4 mp3 gif

Quality

4k 1080p 720p

MP4 outputs support 4k, 1080p, and 720p. GIF stays on 720p/1080p. MP3 exports ignore video quality. high=1080p, medium=720p. If a source tops out lower, FastClip auto-downgrades to the highest available quality at or below the request and returns the delivered quality in API responses.

Limits

Max clip10 min
GIF max30 sec
Source video (clips/AI)3 hr
Source video (download)unlimited
AI query500 chars
Clip name200 chars

Clip Lifecycle

1

New clips expire in 24 hours by default

2

Pin to keep permanently (counts against storage)

3

Unpin starts a new 24hr countdown

Expired clips return 404. Download URLs are presigned & regenerated on each request.

Pricing

Manual clip $0.10 base
AI auto-clip $0.20/hr
Full download $0.05 base
Analyze only $0.10/hr

True 4K MP4 manual clips cost $0.20, true 4K MP4 downloads cost $0.10, and true 4K MP4 auto-clips add a flat $0.10 per job. Auto-clip extra segments remain +$0.10 each. Pricing is based on delivered quality, not just the requested tier.

Storage

1 GB free per account. Only pinned clips count.

Check: GET /v1/storage

Buy: POST /v1/storage/purchase { "gb": 5 }

Share Links

Each clip gets a public URL. No auth needed to view.

Page: /c/{clip_id}

API: GET /v1/share/{clip_id}

Returns name, format, duration, stream & download URLs. Expires with clip.

FAQ

What video sites are supported? +

FastClip currently supports YouTube URLs, including youtube.com and youtu.be. Some URLs may still be blocked by YouTube and return 422. More platforms are planned.

How does pay-as-you-go work? +

Deposit funds into your account with a $5 minimum and pay only for each job you run. Manual clips cost $0.10, AI auto-clip starts at $0.20 per hour of source video, full downloads start at $0.05, and there are no subscriptions. True 4K MP4 jobs cost more, but only when FastClip actually delivers 4K.

What is AI Auto-Clip? +

AI Auto-Clip lets you describe the moment you want in plain English. FastClip analyzes the video, finds matching highlights, and can return multiple clips when several moments match the prompt.

What's the maximum clip length? +

Manual and AI clips can be up to 10 minutes long. GIF exports are limited to 30 seconds.

How long are download links valid? +

Download links stay live for 24 hours unless the clip is pinned. Pinned clips remain in storage until you unpin or delete them.

What if a clip fails to process? +

FastClip automatically refunds the reserved amount for any failed clip job, so you are never charged for failed processing.

Is API Reload secure? +

API Reload is off by default. When enabled, you should also set a reload password and or email confirmation so an exposed API key cannot charge saved cards without another check.

What are the rate limits? +

API-key requests are limited to 60 requests per minute per key. Clip jobs are limited to 20 per hour per user, and reload is limited to 10 per hour.

Do I need a credit card to start? +

No. New accounts receive a $5.00 free balance after email verification, which is enough to try the platform before adding funds.

What is AI Analyze? +

AI Analyze returns timestamps, confidence scores, and transcript excerpts without rendering a clip, so you can preview likely highlights before creating outputs.

Are deposits refundable? +

No. Deposits are non-refundable, but failed jobs are automatically refunded back to your FastClip balance.

What output formats are available? +

FastClip exports MP4 video, MP3 audio, and GIF outputs. MP4 requests support 720p, 1080p, and 4K. GIF stays on 720p and 1080p. MP3 audio ignores video quality.

What should I know about 4K exports? +

4K clips are slower to process and may have limited playback compatibility on some devices. Best for download-first workflows. On our benchmark, a 4K full download was about 3.6x slower and about 5.6x larger than the 1080p-compatible path, and the 4K clip output was about 7x larger than the 1080p clip.

What happens if the source doesn't support my requested quality? +

FastClip auto-downgrades to the highest available quality at or below your request. If you request 4K and the source only supports 1080p, FastClip exports 1080p. If you request 720p and the source tops out at 480p, FastClip exports 480p. The delivered quality is returned in the API response, shown in History, and used for pricing so you are not charged a 4K premium unless true 4K is delivered.

Can I manage clips through the API? +

Yes. The API supports listing clip history, renaming clips, pinning and unpinning them, deleting them, checking balance, listing saved cards, deleting saved cards, and reloading balance. Full downloads only appear in history if you call POST /v1/download with save_to_library set to true.

What does pinning a clip do? +

Pinning keeps a clip in your storage so it will not expire after 24 hours. Pinned clips count against your storage quota until you unpin or delete them.

How does clip storage work? +

Every account gets 1 GB of free storage for pinned clips. You can purchase one-time storage add-ons if you need more capacity for saved highlights.