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.
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.
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.mp4Ett multipart-formulär fungerar också. Filen läggs i fältet file och mappen kan anges som formulärfältet folder_id:
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.
| Status | Betydelse |
|---|---|
201 | Filen togs emot och ställdes i kö för bearbetning |
200 | Samma innehåll finns redan i ditt bibliotek; duplicate är true |
401 | Nyckeln saknas eller är ogiltig |
404 | Målmappen finns inte |
409 | Inte tillräckligt med lagringsutrymme |
413 | Filen är större än din plan tillåter |
429 | För många förfrågningar; vänta och försök igen |
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.
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.
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.
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.
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.
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.mp4curl -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äg | Passar bäst för | Tänk på |
|---|---|---|
| Uppladdning via API | Appar och backends som laddar upp åt användare | Minnesanvändning om klienten läser in hela filen först |
| Import via URL | Filer som redan har en offentlig direktlänk | Endast direkta http(s)-länkar; högst tio aktiva importer |
| WebDAV | Stora filer, montera biblioteket som en enhet | Använd din e-postadress och API-nyckel som inloggningsuppgifter |
| FTP / FTPS | Befintliga verktyg och skript, massöverföring | Anvä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.
Ladda upp en video och få en HLS-spelare och en API-nyckel på några minuter. Planernas gränser finns på prissidan.