APIUploadWebDAV

Przesyłanie wideo przez API: curl, Python, Node.js, WebDAV i FTP

Przesyłaj i importuj wideo przez REST API UFOLOAD w curl, Python i Node.js, czekaj na koniec kodowania, a duże pliki wysyłaj przez WebDAV lub FTP.

Możesz umieścić wideo w UFOLOAD, w ogóle nie otwierając panelu. REST API przyjmuje pliki przez HTTPS, serwer może sam pobrać plik z linku, a to samo konto jest dostępne przez WebDAV i FTP dla narzędzi, które już obsługują te protokoły. Ten poradnik omawia wszystkie pięć dróg z działającymi poleceniami, wyjaśnia, co odpowiada serwer, i pokazuje, jak poczekać na zakończenie kodowania. Poniższe endpointy zostały sprawdzone z publiczną specyfikacją OpenAPI; pełny opis znajdziesz w dokumentacji API.

Utwórz klucz API

Utwórz klucz w sekcji Dla deweloperów w panelu. Każde żądanie przekazuje go jako token bearer w nagłówku Authorization. Klucz jest wyświetlany tylko raz, przy tworzeniu, więc zapisz go w zmiennej środowiskowej lub menedżerze sekretów i unieważnij w panelu, jeśli wycieknie. Ten sam klucz służy jako hasło do WebDAV i FTP, a loginem jest adres e-mail konta. Jeśli nie masz jeszcze konta, załóż darmowe; cennik podaje limit rozmiaru pliku oraz limity przestrzeni i ruchu obowiązujące w Twoim planie.

bash
export UFOLOAD_API_KEY="ufo_..."

Przesyłanie przez curl

Najprostsze przesłanie wysyła plik jako surową treść żądania, a jego nazwę umieszcza w nagłówku X-File-Name. Jeśli nazwa zawiera spacje lub znaki spoza ASCII, wyślij ją zakodowaną procentowo (UTF-8). Domyślnie plik trafia do folderu głównego; dodaj ?folder_id= lub nagłówek X-Folder-Id, aby wybrać inny.

Surowa treść żądania · 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

Formularz multipart też działa. Plik trafia do pola file, a folder można podać w polu formularza folder_id:

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

Udane przesłanie zwraca 201 z treścią JSON zawierającą obiekt pliku. Najczęściej używane pola to id, public_id (krótki kod, który trafia do adresów odtwarzacza), status, duration_ms i max_quality. Serwer nie zajmuje dodatkowego miejsca na treści, które już ma: jeśli prześlesz ponownie te same bajty, odpowie 200 z istniejącym plikiem i "duplicate": true, dopasowując pliki po skrócie SHA-256.

StatusZnaczenie
201Plik został przyjęty i dodany do kolejki przetwarzania
200Ta sama treść jest już w Twojej bibliotece; duplicate ma wartość true
401Brak klucza lub klucz jest nieprawidłowy
404Folder docelowy nie istnieje
409Za mało miejsca na dane
413Plik jest większy, niż pozwala Twój plan
429Zbyt wiele żądań; poczekaj i spróbuj ponownie
Wskazówka

Duże przesyłania nie podlegają krótkim limitom czasu obowiązującym zwykłe wywołania API. Serwer przyjmuje treść tak długo, jak długo napływa, więc wolne łącze nie przerwie przesyłania wielu gigabajtów, choć zbyt długa przerwa między blokami wciąż może zostać ucięta przez reverse proxy.

Poczekaj, aż wideo będzie gotowe

Przesłanie to dopiero pierwsza połowa. Potem plik trafia do kolejki i jest kodowany do adaptacyjnej drabinki HLS (zobacz, jak budowana jest drabinka). Jego status przechodzi przez uploading, queued i processing i kończy się na ready lub failed; nieudany plik zawiera komunikat error. Odpytuj plik co kilka sekund, nigdy w ciasnej pętli: API ma limity zapytań i odpowiada 429.

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

Odpowiedź ma dwie części: file z metadanymi oraz links z podpisanymi adresami głównej playlisty (playback), okładki (poster), sprite’a podglądu po najechaniu (sprite), każdej wersji oraz expires_at. Jeśli potrzebujesz innego czasu ważności, POST /files/{id}/links wydaje linki ważne od 60 sekund do 30 dni, opcjonalnie powiązane z adresem IP lub ciasteczkiem.

Python

W bibliotece requests przekazanie otwartego obiektu pliku przesyła go strumieniowo z dysku, więc zużycie pamięci pozostaje stałe nawet przy dużych filmach. Poniższa funkcja przesyła plik, a potem czeka na wynik.

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 i nowsze mają wbudowane fetch, więc nie trzeba żadnych zależności. Ta wersja wczytuje plik do pamięci, co wystarcza dla klipów i krótkich filmów; dla plików o rozmiarze wielu gigabajtów wybierz curl, WebDAV lub FTP, które przesyłają dane strumieniowo z dysku.

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 z URL

Jeśli wideo jest już dostępne online pod bezpośrednim linkiem, pozwól serwerowi je pobrać, zamiast ściągać je na swój komputer i wysyłać ponownie. Wywołanie od razu zwraca 202 z zadaniem importu; serwer pobiera plik, a potem dodaje go do kolejki kodowania. Linki do sieci wewnętrznych, adresów loopback i zakresów adresów usługowych są odrzucane, możesz mieć do dziesięciu aktywnych importów, a GET /files/import pokazuje postęp.

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

Do transferów hurtowych i narzędzi, które nie potrafią wywoływać API, ta sama biblioteka jest dostępna przez WebDAV i FTP. Loginem jest adres e-mail konta, a hasłem — klucz API. Obie metody przesyłają dane strumieniowo z dysku i są najpewniejszą opcją dla bardzo dużych plików.

WebDAV przez 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 z jawnym 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/

Używaj wariantów szyfrowanych zawsze, gdy Twój klient je obsługuje, bo hasłem jest klucz API. Każdy klient obsługujący WebDAV lub FTPS, od menedżerów plików po narzędzia synchronizacji, może użyć tych samych danych. Pliki skopiowane w ten sposób pojawiają się w bibliotece i są kodowane jak każde inne przesłanie.

Którą drogę wybrać

DrogaNajlepsza doNa co uważać
Przesyłanie przez APIAplikacje i backendy przesyłające pliki w imieniu użytkownikówZużycie pamięci, jeśli klient najpierw wczytuje cały plik
Import z URLPliki, które mają już publiczny bezpośredni linkTylko bezpośrednie linki http(s); limit dziesięciu aktywnych importów
WebDAVDuże pliki, montowanie biblioteki jako dyskuJako danych logowania użyj e-maila i klucza API
FTP / FTPSIstniejące narzędzia i skrypty, transfer hurtowyUżyj opcji z jawnym TLS

Użyj wideo

Gdy status to ready, adres odtwarzacza to https://iframe.andromedans.live/e/ z dopisanym public_id — dokładnie to wstawiasz do iframe (długie id też działa i przekierowuje na krótki adres); poradnik osadzania pokazuje kod oraz alternatywę z hls.js. Możesz ograniczyć, gdzie wideo się odtwarza, regułami dla domen i krajów, a gdy reklamy są dostępne, włączyć je, by zarabiać na wyświetleniach. Trzymaj klucz z dala od kodu przeglądarki, zmieniaj go, gdy ktoś odchodzi z zespołu, i pamiętaj, że API jest dostępne w każdym planie, więc możesz zacząć budować już dziś.

Wypróbuj z darmowym kontem

Prześlij wideo, a w kilka minut dostaniesz odtwarzacz HLS i klucz API. Limity planów znajdziesz w cenniku.