APIUploadWebDAV

Upload videoer via API: curl, Python, Node.js, WebDAV og FTP

Upload og importér videoer med UFOLOADs REST API via curl, Python og Node.js, vent på kodningen, og brug WebDAV eller FTP til store filer.

Du kan lægge en video på UFOLOAD uden nogensinde at åbne dashboardet. REST API'et modtager uploads over HTTPS, serveren kan hente en fil fra et link for dig, og den samme konto kan nås via WebDAV og FTP fra værktøjer, der allerede taler de protokoller. Denne guide gennemgår alle fem veje med fungerende kommandoer, forklarer, hvad serveren svarer, og viser, hvordan du venter på, at kodningen bliver færdig. Endpoints nedenfor er tjekket mod den offentlige OpenAPI-specifikation; API-dokumentationen har den fulde reference.

Opret en API-nøgle

Opret en nøgle i sektionen Udviklere i dit dashboard. Hver forespørgsel sender den som bearer-token i headeren Authorization. Nøglen vises kun én gang, når den oprettes, så gem den i en miljøvariabel eller en secrets manager, og tilbagekald den fra dashboardet, hvis den slipper ud. Den samme nøgle fungerer som adgangskode til WebDAV og FTP med din kontos e-mail som brugernavn. Har du ikke en konto endnu, så opret en gratis; prissiden viser grænsen for filstørrelse og de kvoter for lagerplads og trafik, der gælder for din plan.

bash
export UFOLOAD_API_KEY="ufo_..."

Upload med curl

Den enkleste upload sender filen som rå request body og lægger navnet i headeren X-File-Name. Send navnet procentkodet (UTF-8), hvis det indeholder mellemrum eller tegn uden for ASCII. Som standard havner filen i rodmappen; tilføj ?folder_id= eller en X-Folder-Id-header for at vælge en anden.

Rå body · bash
curl -X POST "https://ufoload.com/api/v1/files?folder_id=root" \
  -H "Authorization: Bearer $UFOLOAD_API_KEY" \
  -H "X-File-Name: holiday-2026.mp4" \
  -H "Content-Type: video/mp4" \
  --data-binary @holiday-2026.mp4

En multipart-formular virker også. Filen lægges i feltet file, og mappen kan angives som formularfeltet folder_id:

Multipart-formular · bash
curl -X POST "https://ufoload.com/api/v1/files" \
  -H "Authorization: Bearer $UFOLOAD_API_KEY" \
  -F "file=@holiday-2026.mp4"

En vellykket upload svarer 201 med en JSON-body, der indeholder filobjektet. De felter, du oftest bruger, er id, public_id (den korte kode, der indgår i afspilleradresser), status, duration_ms og max_quality. Serveren bruger ikke ekstra plads på indhold, den allerede har: Uploader du de samme bytes igen, svarer den 200 med den eksisterende fil og "duplicate": true, idet filer matches på deres SHA-256-hash.

StatusBetydning
201Filen er modtaget og sat i kø til behandling
200Det samme indhold ligger allerede i dit bibliotek; duplicate er true
401Nøglen mangler eller er ugyldig
404Destinationsmappen findes ikke
409Ikke nok lagerplads
413Filen er større, end din plan tillader
429For mange forespørgsler; vent og prøv igen
Tip

Store uploads er ikke underlagt de korte timeouts, der gælder for almindelige API-kald. Serveren tager imod body, så længe den bliver ved med at komme, så en langsom forbindelse ødelægger ikke en upload på flere gigabyte, men en for lang pause mellem blokkene kan stadig blive afbrudt af reverse proxyen.

Vent, til videoen er klar

Upload er kun første halvdel. Derefter sættes filen i kø og kodes til en adaptiv HLS-stige (se hvordan stigen bygges). Dens status går gennem uploading, queued og processing og ender på ready eller failed; en mislykket fil har en error-besked. Spørg efter filen med få sekunders mellemrum, aldrig i en tæt løkke: API'et har hastighedsgrænser og svarer 429.

bash
curl "https://ufoload.com/api/v1/files/FILE_ID" \
  -H "Authorization: Bearer $UFOLOAD_API_KEY"

Svaret har to dele: file med metadata og links med signerede adresser til master-playlisten (playback), coverbilledet (poster), sprite-billedet til forhåndsvisning ved hover (sprite), hver version og expires_at. Har du brug for en anden levetid, udsteder POST /files/{id}/links links, der er gyldige fra 60 sekunder til 30 dage, eventuelt bundet til en IP-adresse eller en cookie.

Python

Med biblioteket requests streames filen fra disken, når du sender det åbne filobjekt, så hukommelsesforbruget forbliver fladt selv for store videoer. Funktionen nedenfor uploader og venter derefter på resultatet.

python
import os
import time
import urllib.parse

import requests

BASE = "https://ufoload.com/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['UFOLOAD_API_KEY']}"}


def upload(path, folder_id="root"):
    name = urllib.parse.quote(os.path.basename(path))
    with open(path, "rb") as f:
        r = requests.post(
            f"{BASE}/files",
            params={"folder_id": folder_id},
            data=f,
            headers={**HEADERS, "X-File-Name": name, "Content-Type": "application/octet-stream"},
        )
    r.raise_for_status()
    return r.json()["file"]


def wait_ready(file_id, timeout=3600):
    deadline = time.time() + timeout
    while time.time() < deadline:
        r = requests.get(f"{BASE}/files/{file_id}", headers=HEADERS)
        r.raise_for_status()
        data = r.json()
        status = data["file"]["status"]
        if status == "ready":
            return data
        if status == "failed":
            raise RuntimeError(data["file"].get("error") or "encoding failed")
        time.sleep(5)
    raise TimeoutError("video is still processing")


file = upload("holiday-2026.mp4")
data = wait_ready(file["id"])
print("embed:", f"https://iframe.andromedans.live/e/{file['public_id']}")
print("playlist:", data["links"]["playback"])

Node.js

Node.js 18 og nyere har fetch indbygget, så der kræves ingen afhængigheder. Denne version læser filen ind i hukommelsen, hvilket er fint til klip og korte videoer; til filer på flere gigabyte er curl, WebDAV eller FTP at foretrække, da de streamer fra disken.

js
import { readFile } from 'node:fs/promises'
import { basename } from 'node:path'
import { setTimeout as sleep } from 'node:timers/promises'

const BASE = 'https://ufoload.com/api/v1'
const headers = { Authorization: `Bearer ${process.env.UFOLOAD_API_KEY}` }

async function upload(path) {
  const res = await fetch(`${BASE}/files?folder_id=root`, {
    method: 'POST',
    headers: { ...headers, 'X-File-Name': encodeURIComponent(basename(path)), 'Content-Type': 'application/octet-stream' },
    body: await readFile(path),
  })
  if (!res.ok) throw new Error(`upload failed: ${res.status}`)
  return (await res.json()).file
}

async function waitReady(id) {
  for (;;) {
    const res = await fetch(`${BASE}/files/${id}`, { headers })
    if (!res.ok) throw new Error(`status check failed: ${res.status}`)
    const data = await res.json()
    if (data.file.status === 'ready') return data
    if (data.file.status === 'failed') throw new Error(data.file.error || 'encoding failed')
    await sleep(5000)
  }
}

const file = await upload('holiday-2026.mp4')
const data = await waitReady(file.id)
console.log('embed:', `https://iframe.andromedans.live/e/${file.public_id}`)
console.log('playlist:', data.links.playback)

Import via URL

Ligger videoen allerede online på et direkte link, så lad serveren hente den i stedet for at trække den ned på din maskine og sende den op igen. Kaldet returnerer straks 202 med en importopgave; serveren henter filen og sætter den derefter i kø til kodning. Links til interne netværk, loopback og serviceadresseområder afvises, du kan have op til ti aktive importer, og GET /files/import viser fremskridtet.

bash
curl -X POST "https://ufoload.com/api/v1/files/import" \
  -H "Authorization: Bearer $UFOLOAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com/video.mp4", "name": "video.mp4"}'

WebDAV og FTP

Til masseoverførsler og til værktøjer, der ikke kan kalde et API, er det samme bibliotek tilgængeligt via WebDAV og FTP. Brugernavnet er din kontos e-mail, og adgangskoden er en API-nøgle. Begge streamer fra disken og er den mest robuste løsning til meget store filer.

WebDAV over HTTPS, port 443 · bash
curl -u "you@example.com:$UFOLOAD_API_KEY" https://ufoload.com/dav/
curl -u "you@example.com:$UFOLOAD_API_KEY" -T holiday-2026.mp4 https://ufoload.com/dav/holiday-2026.mp4
FTP med eksplicit TLS, port 21 · bash
curl -u "you@example.com:$UFOLOAD_API_KEY" ftp://ftp.ufoload.com/
curl -u "you@example.com:$UFOLOAD_API_KEY" --ftp-ssl -T holiday-2026.mp4 ftp://ftp.ufoload.com/

Brug de krypterede varianter, når din klient understøtter dem, for API-nøglen er adgangskoden. Enhver klient, der taler WebDAV eller FTPS, fra filhåndteringsprogrammer til synkroniseringsværktøjer, kan bruge de samme oplysninger. Filer, der kopieres på denne måde, dukker op i dit bibliotek og kodes som enhver anden upload.

Hvilken vej skal du vælge?

VejBedst tilPas på
API-uploadApplikationer og backends, der uploader på vegne af brugereHukommelsesforbrug, hvis klienten læser hele filen først
Import via URLFiler, der allerede har et offentligt direkte linkKun direkte http(s)-links; grænse på ti aktive importer
WebDAVStore filer, montering af biblioteket som et drevBrug din e-mail og API-nøgle som loginoplysninger
FTP / FTPSEksisterende værktøjer og scripts, masseoverførselBrug muligheden med eksplicit TLS

Brug videoen

Når statussen er ready, er afspilleradressen https://iframe.andromedans.live/e/ efterfulgt af public_id, hvilket er præcis det, du sætter i en iframe (det lange id virker også og omdirigeres til den korte adresse); guiden til indlejring viser markup og alternativet med hls.js. Du kan begrænse, hvor den afspilles, med regler for domæner og lande, og når annoncer er tilgængelige, kan du slå dem til for at tjene penge på visninger. Hold nøglen ude af browserkode, udskift den, når folk forlader dit team, og husk, at API'et er tilgængeligt på alle planer, så du kan begynde at bygge i dag.

Prøv det med en gratis konto

Upload en video, og få en HLS-afspiller og en API-nøgle på få minutter. Plangrænserne står på prissiden.