APIUploadWebDAV

Ladda upp videor via API: curl, Python, Node.js, WebDAV och FTP

Ladda upp och importera videor med UFOLOAD REST API via curl, Python och Node.js, vänta på kodningen och använd WebDAV eller FTP för stora filer.

Du kan lägga upp en video på UFOLOAD utan att någonsin öppna instrumentpanelen. REST API tar emot uppladdningar över HTTPS, servern kan hämta en fil från en länk åt dig, och samma konto nås över WebDAV och FTP för verktyg som redan talar de protokollen. Den här guiden går igenom alla fem vägarna med fungerande kommandon, förklarar vad servern svarar och visar hur du väntar tills kodningen är klar. Endpoints nedan har kontrollerats mot den offentliga OpenAPI-specifikationen; API-dokumentationen innehåller hela referensen.

Skapa en API-nyckel

Skapa en nyckel i avsnittet Utvecklare i instrumentpanelen. Varje förfrågan skickar den som bearer-token i huvudet Authorization. Nyckeln visas bara en gång när den skapas, så spara den i en miljövariabel eller en hemlighetshanterare och återkalla den från instrumentpanelen om den läcker. Samma nyckel fungerar som lösenord för WebDAV och FTP, med kontots e-postadress som inloggning. Om du inte har något konto än kan du skapa ett gratis; prissidan listar den filstorleksgräns och de kvoter för lagring och trafik som gäller för din plan.

bash
export UFOLOAD_API_KEY="ufo_..."

Ladda upp med curl

Den enklaste uppladdningen skickar filen som rå förfrågningskropp och lägger namnet i huvudet X-File-Name. Skicka namnet procentkodat (UTF-8) om det innehåller mellanslag eller tecken utanför ASCII. Som standard hamnar filen i rotmappen; lägg till ?folder_id= eller ett X-Folder-Id-huvud för att välja en annan.

Rå kropp · 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

Ett multipart-formulär fungerar också. Filen läggs i fältet file och mappen kan anges som formulärfältet folder_id:

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

En lyckad uppladdning svarar 201 med en JSON-kropp som innehåller filobjektet. De fält du kommer att använda mest är id, public_id (den korta kod som ingår i spelaradresser), status, duration_ms och max_quality. Servern använder inte extra utrymme för innehåll som den redan har: om du laddar upp samma byte igen svarar den 200 med den befintliga filen och "duplicate": true, och filerna matchas via sin SHA-256-hash.

StatusBetydelse
201Filen togs emot och ställdes i kö för bearbetning
200Samma innehåll finns redan i ditt bibliotek; duplicate är true
401Nyckeln saknas eller är ogiltig
404Målmappen finns inte
409Inte tillräckligt med lagringsutrymme
413Filen är större än din plan tillåter
429För många förfrågningar; vänta och försök igen
Tips

Stora uppladdningar omfattas inte av de korta tidsgränser som gäller för vanliga API-anrop. Servern tar emot kroppen så länge data fortsätter att komma, så en långsam anslutning bryter inte en uppladdning på flera gigabyte, men en för lång paus mellan blocken kan fortfarande avbrytas av den omvända proxyn.

Vänta tills videon är klar

Uppladdningen är bara första halvan. Därefter ställs filen i kö och kodas till en adaptiv HLS-stege (se hur stegen byggs). Dess status går igenom uploading, queued och processing och slutar på ready eller failed; en misslyckad fil har ett error-meddelande. Fråga efter filen med några sekunders mellanrum och aldrig i en tät loop: API:et har anropsgränser och svarar 429.

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

Svaret har två delar: file med metadata och links med signerade adresser till huvudspellistan (playback), omslaget (poster), spriten för förhandsvisning vid hovring (sprite), varje version samt expires_at. Om du behöver en annan livslängd utfärdar POST /files/{id}/links länkar som är giltiga från 60 sekunder till 30 dagar, valfritt bundna till en IP-adress eller en cookie.

Python

Med biblioteket requests strömmas filen från disken när du skickar det öppna filobjektet, så minnesanvändningen förblir jämn även för stora videor. Funktionen nedan laddar upp och väntar sedan 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 och senare har fetch inbyggt, så inga beroenden behövs. Den här versionen läser in filen i minnet, vilket går bra för klipp och korta videor; för filer på flera gigabyte är curl, WebDAV eller FTP att föredra, eftersom de strömmar från 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

Om videon redan finns online på en direktlänk kan du låta servern ladda ner den i stället för att hämta den till din dator och skicka upp den igen. Anropet returnerar 202 direkt med en importuppgift; servern hämtar filen och ställer den sedan i kö för kodning. Länkar till interna nätverk, loopback och tjänsteadressintervall avvisas, du kan ha upp till tio aktiva importer samtidigt och GET /files/import visar förloppet.

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 och FTP

För massöverföringar och för verktyg som inte kan anropa ett API finns samma bibliotek tillgängligt över WebDAV och FTP. Inloggningen är kontots e-postadress och lösenordet är en API-nyckel. Båda strömmar från disken och är det mest robusta alternativet för mycket stora filer.

WebDAV över 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 explicit 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/

Använd de krypterade varianterna när din klient stöder dem, eftersom API-nyckeln är lösenordet. Alla klienter som talar WebDAV eller FTPS, från filhanterare till synkverktyg, kan använda samma uppgifter. Filer som kopieras på det här sättet dyker upp i ditt bibliotek och kodas som alla andra uppladdningar.

Vilken väg ska du välja

VägPassar bäst förTänk på
Uppladdning via APIAppar och backends som laddar upp åt användareMinnesanvändning om klienten läser in hela filen först
Import via URLFiler som redan har en offentlig direktlänkEndast direkta http(s)-länkar; högst tio aktiva importer
WebDAVStora filer, montera biblioteket som en enhetAnvänd din e-postadress och API-nyckel som inloggningsuppgifter
FTP / FTPSBefintliga verktyg och skript, massöverföringAnvänd alternativet med explicit TLS

Använd videon

När statusen är ready är spelaradressen https://iframe.andromedans.live/e/ följt av public_id, vilket är precis det du lägger i en iframe (det långa id fungerar också och omdirigeras till den korta adressen); inbäddningsguiden visar koden och alternativet med hls.js. Du kan begränsa var videon spelas upp med regler för domäner och länder och, när annonser är tillgängliga, aktivera dem för att tjäna pengar på visningar. Håll nyckeln borta från kod i webbläsaren, byt ut den när personer lämnar ditt team, och kom ihåg att API:et finns på alla planer, så du kan börja bygga redan i dag.

Prova med ett gratiskonto

Ladda upp en video och få en HLS-spelare och en API-nyckel på några minuter. Planernas gränser finns på prissidan.