edit-api reference

Logiczny podzial endpointow i wszystkie obslugiwane przypadki

Ta strona jest uporzadkowana wedlug workflow: start, przypadki obslugiwane przez renderery, lifecycle joba oraz endpointy do tworzenia, monitorowania i pobierania wynikow. Pokazuje wszystkie scenariusze, ktore obecnie obsluguje nasze API.

Szybkie linki

http://192.168.10.100:8000/

http://192.168.10.100:8000/reference

http://192.168.10.100:8000/logs

http://192.168.10.100:8000/docs

http://192.168.10.100:8000/openapi.json

http://192.168.10.100:8000/health

Jak czytac te instrukcje

Najpierw wybierasz renderer i wariant wejscia, potem tworzysz job, odpytujesz jego status pod /v1/jobs/{job_id}, a na koncu pobierasz wynik z downloadUrl.

Public base URLhttp://192.168.10.100:8000
FFmpeg loopModerestart, ping-pong
Veo proporcje16:9, 9:16
Veo resolution720p, 1080p
Vertex req timeout300s
Vertex retries2x / 3s
Nano max refs14
Reference rootstorage/inputs/
1. Wybierz caseFFmpeg, Vertex Veo albo Nano Banana Pro.
2. Zbuduj requestUzyj jednej z gotowych sekcji ponizej zgodnie z typem wejscia.
3. Odpytuj statusTen sam endpoint /v1/jobs/{job_id} obsluguje wszystkie joby.
4. Pobierz wynikPo status=completed korzystasz z downloadUrl albo /downloads/{filename}.

Obslugiwane przypadki

To jest matryca wszystkich scenariuszy, ktore API obsluguje teraz w kodzie: wejscia, warianty renderu, limity, tryby petli i wspolny flow statusow.

FFmpeg

Skladanie filmu z assetow

Ten renderer obsluguje klasyczny montaz z muzyki, petli wideo i opcjonalnego intro image.

  • imageUrl albo imagePath jest opcjonalne.
  • audioUrl albo audioPath jest wymagane.
  • loopVideoUrl albo loopVideoPath jest wymagane.
  • Mozesz mieszac URL-e i lokalne sciezki pomiedzy roznymi polami requestu.
  • Nie wolno podawac jednoczesnie URL i Path dla tego samego assetu.
FFmpeg

Petla, intro i timing

Tutaj sa wszystkie aktualnie wspierane warianty zachowania osi czasu dla renderu FFmpeg.

  • loopMode obsluguje: restart, ping-pong.
  • Wariant bez obrazu startowego jest wspierany i render zaczyna sie od razu od petli wideo.
  • Przy intro image fadeSeconds musi byc mniejsze od introSeconds.
  • Format wyjsciowy dla FFmpeg jest obecnie ograniczony do: mp4.
  • Width, height i fps sa konfigurowalne per job.
FFmpeg

Singing visualizer z intro i overlay

Dedykowany flow do prostych klipow wokalnych: intro video, przejscie do statycznego zdjecia i petla wizualizera nad zdjeciem.

  • Uzywasz dedykowanego POST /v1/singing-visualizer/jobs.
  • Audio startuje od pierwszej klatki razem z intro video.
  • Przejscie z intro video do zdjecia realizuje xfade o dlugosci fadeSeconds.
  • Na zdjecie jest nakladane petlowe overlay video z kluczowaniem czerni do transparentnosci.
  • Parametr blackThreshold steruje sila usuwania czerni z overlay video. Domyslnie 2.
  • Do konca muzyki zostaje statyczne zdjecie z overlayem, a final dostaje fade out.
Vertex Veo

Generowanie wideo przez Vertex AI

Ten wariant tworzy asynchroniczny plik MP4 na podstawie promptu i ustawien modelu Veo.

  • Uzywasz renderer=vertex-veo w POST /v1/jobs.
  • Prompt jest wymagany, negativePrompt i referenceFolderPath sa opcjonalne.
  • referenceFolderPath jest interpretowane jako asset references dla Veo i musi byc relatywne do storage/inputs/.
  • Limit obrazow referencyjnych dla Veo: 1-3. Wspierane MIME: image/png, image/jpeg.
  • Aspect ratio: 16:9, 9:16.
  • Resolution: 720p, 1080p.
  • durationSeconds jest wspierane w zakresie 4-8 sekund dla prompt-only, ale przy referenceFolderPath musi wynosic 8 sekund.
  • Timeouty, bledy sieci i HTTP 408/429/5xx sa automatycznie ponawiane do 2 prob z backoffem od 3s.
  • generateAudio i personGeneration sa przekazywane do Vertex AI.
Nano Banana Pro

Generowanie obrazu z folderu referencyjnego

Ten wariant bierze wszystkie wspierane zdjecia z jednego katalogu i dolacza je do kazdego promptu.

  • Uzywasz dedykowanego POST /v1/nano-banana-pro/jobs.
  • referenceFolderPath musi byc relatywne do storage/inputs/.
  • Tworzenie joba wymaga metody POST. GET na tej sciezce zwraca blad z podpowiedzia poprawnego wywolania.
  • Przy kazdym promcie worker skanuje folder od nowa i bierze wszystkie wspierane obrazy w kolejnosci alfabetycznej.
  • Limit obrazow referencyjnych: 1-14.
  • Aspect ratio: 1:1, 3:2, 2:3, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9, 21:9.
  • Image size: 1K, 2K, 4K. Domyslnie 1K.
  • Output format: png, jpg. Domyslnie png.
  • Timeouty, bledy sieci i HTTP 408/429/5xx sa automatycznie ponawiane do 2 prob z backoffem od 3s.
  • Wspierane MIME dla referencji: image/png, image/jpeg, image/webp, image/heic, image/heif.
Wspolne

Statusy, wynik i pobranie pliku

Te elementy sa wspolne dla wszystkich rendererow i wszystkich jobow, niezaleznie od backendu.

  • Kazdy job zwraca id i statusUrl.
  • GET /v1/jobs/{job_id} obsluguje standardowy FFmpeg, singing visualizer, Veo i Nano Banana Pro.
  • downloadUrl pojawia sie dopiero po status=completed.
  • Flow FFmpeg i Veo zapisuje wynik jako MP4, Nano Banana Pro jako plik obrazu w formacie png albo jpg zgodnym z outputFormat.
Monitoring

Live logs z storage/logs

Oddzielna strona i API pozwalaja sledzic na zywo pliki logow generowane przez joby FFmpeg, Veo i Nano Banana.

  • Uzywasz strony /logs albo /live-logs do podgladu z auto-refresh.
  • GET /v1/logs zwraca liste najnowszych plikow logow z metadanymi.
  • GET /v1/logs/{log_name} zwraca tail wybranego pliku.
  • Podglad obejmuje pliki z storage/logs, nie stdout kontenerow docker compose.

Lifecycle joba

Te statusy sa raportowane przez worker i widoczne przez GET /v1/jobs/{job_id}. Nie wszystkie statusy pojawiaja sie w kazdym rendererze, ale to jest pelna lista aktualnie wspierana przez implementacje.

queued 0%

Job jest zapisany i czeka w kolejce RQ.

authenticating 10%

Worker odswieza token lub sprawdza lokalne ADC dla Vertex AI.

downloading 10%

FFmpeg pobiera assety podane przez URL-e do storage/inputs/downloaded/.

requesting 25%

Worker wysyla request do Vertex AI albo uruchamia zewnetrzny backend.

validating 30%

Trwa walidacja assetow, parametrow, folderu referencyjnego albo metadanych joba.

polling 60%

Worker odpytuje dlugotrwala operacje Veo do momentu zakonczenia.

rendering 60%

FFmpeg sklada finalne wideo na podstawie przygotowanych assetow.

saving 85%

Wynik modelu albo renderu jest zapisywany do storage/outputs/.

uploading 90%

Finalizowane sa metadane wyniku i przygotowywany jest downloadUrl.

completed 100%

Job zakonczyl sie sukcesem i wynik mozna pobrac.

failed 100%

Job zakonczyl sie bledem i pole error zawiera opis problemu albo wyczerpania retry.

Start i monitoring

Najpierw sprawdzasz zdrowie serwisu, potem wybierasz odpowiedni renderer albo dedykowany endpoint obrazowy.

GET /health

Healthcheck

Najprostszy endpoint startowy do sprawdzenia, czy API odpowiada i z jaka kolejka pracuje.

Curl

curl http://192.168.10.100:8000/health

Przykladowa odpowiedz

{
  "status": "ok",
  "queue": "video-jobs"
}
  • Nadaje sie do monitoringu po starcie docker compose.
  • Nie wymaga body ani autoryzacji.
GET /logs

Live logs: strona operatorska

Strona z auto-refresh do podgladu plikow z storage/logs na zywo.

Curl

curl http://192.168.10.100:8000/logs
  • To jest widok operatorski z lista logow i tailowaniem wybranego pliku.
  • Strona odswieza liste logow i zawartosc wybranego pliku automatycznie.
GET /v1/logs

Lista najnowszych logow

Zwraca najnowsze pliki z katalogu storage/logs wraz z typem, rozmiarem i jobId.

Curl

curl http://192.168.10.100:8000/v1/logs?limit=10

Przykladowa odpowiedz

[
  {
    "name": "job_0f10eb3b5c234ee4.ffmpeg.log",
    "kind": "ffmpeg",
    "jobId": "job_0f10eb3b5c234ee4",
    "sizeBytes": 18234,
    "modifiedAt": "2026-04-25T08:00:00Z",
    "statusUrl": "http://192.168.10.100:8000/v1/jobs/job_0f10eb3b5c234ee4"
  }
]
  • Lista jest sortowana od najnowszego pliku do najstarszego.
  • To API jest uzywane przez strone /logs do odswiezania listy po lewej stronie.
GET /v1/logs/{log_name}

Tail wybranego logu

Zwraca koncowke wybranego pliku logu z katalogu storage/logs.

Curl

curl http://192.168.10.100:8000/v1/logs/job_0f10eb3b5c234ee4.ffmpeg.log?tailBytes=65536

Przykladowa odpowiedz

{
  "name": "job_0f10eb3b5c234ee4.ffmpeg.log",
  "kind": "ffmpeg",
  "jobId": "job_0f10eb3b5c234ee4",
  "sizeBytes": 18234,
  "modifiedAt": "2026-04-25T08:00:00Z",
  "statusUrl": "http://192.168.10.100:8000/v1/jobs/job_0f10eb3b5c234ee4",
  "tailBytes": 65536,
  "truncated": false,
  "content": "ffmpeg version ...\\nframe=..."
}
  • Parametr tailBytes kontroluje ile bajtow czytac od konca pliku.
  • API odrzuca niebezpieczne nazwy plikow i czyta tylko pliki z storage/logs.

Render FFmpeg

Tutaj sa wszystkie glownie uzywane warianty tworzenia jobow wideo skladanych z assetow.

POST /v1/jobs

FFmpeg: URL-e z intro image

Pelny wariant z trzema assetami podanymi przez HTTP lub HTTPS.

Curl

curl -X POST http://192.168.10.100:8000/v1/jobs \
  -H 'Content-Type: application/json' \
  -d '{
  "imageUrl": "http://nas.local/assets/intro.jpg",
  "audioUrl": "http://nas.local/assets/music.mp3",
  "loopVideoUrl": "http://nas.local/assets/loop.mp4",
  "loopMode": "restart",
  "output": {
    "width": 1920,
    "height": 1080,
    "fps": 30,
    "format": "mp4"
  },
  "timing": {
    "introSeconds": 3,
    "fadeSeconds": 1
  }
}'

Body

{
  "imageUrl": "http://nas.local/assets/intro.jpg",
  "audioUrl": "http://nas.local/assets/music.mp3",
  "loopVideoUrl": "http://nas.local/assets/loop.mp4",
  "loopMode": "restart",
  "output": {
    "width": 1920,
    "height": 1080,
    "fps": 30,
    "format": "mp4"
  },
  "timing": {
    "introSeconds": 3,
    "fadeSeconds": 1
  }
}

Przykladowa odpowiedz

{
  "id": "job_3e82f35ad0604f30",
  "status": "queued",
  "statusUrl": "http://192.168.10.100:8000/v1/jobs/job_3e82f35ad0604f30"
}
  • To jest najpelniejszy przypadek dla renderu FFmpeg.
  • imageUrl jest opcjonalne, ale audio i loop video sa wymagane.
POST /v1/jobs

FFmpeg: bez obrazu startowego

Wariant minimalny, gdzie render od razu opiera sie na petli wideo i audio.

Curl

curl -X POST http://192.168.10.100:8000/v1/jobs \
  -H 'Content-Type: application/json' \
  -d '{
  "audioUrl": "http://nas.local/assets/music.mp3",
  "loopVideoUrl": "http://nas.local/assets/loop.mp4",
  "loopMode": "ping-pong"
}'

Body

{
  "audioUrl": "http://nas.local/assets/music.mp3",
  "loopVideoUrl": "http://nas.local/assets/loop.mp4",
  "loopMode": "ping-pong"
}

Przykladowa odpowiedz

{
  "id": "job_3e82f35ad0604f30",
  "status": "queued",
  "statusUrl": "http://192.168.10.100:8000/v1/jobs/job_3e82f35ad0604f30"
}
  • Brak imageUrl albo imagePath jest w pelni wspierany.
  • loopMode=ping-pong buduje cykl przod-tyl przed zasadniczym renderem.
POST /v1/jobs

FFmpeg: lokalne pliki z storage/inputs

Wariant oparty o relatywne sciezki wewnatrz storage/inputs/.

Curl

curl -X POST http://192.168.10.100:8000/v1/jobs \
  -H 'Content-Type: application/json' \
  -d '{
  "imagePath": "images/intro.jpg",
  "audioPath": "music/campaign-01.mp3",
  "loopVideoPath": "loops/water.mp4",
  "loopMode": "restart"
}'

Body

{
  "imagePath": "images/intro.jpg",
  "audioPath": "music/campaign-01.mp3",
  "loopVideoPath": "loops/water.mp4",
  "loopMode": "restart"
}

Przykladowa odpowiedz

{
  "id": "job_3e82f35ad0604f30",
  "status": "queued",
  "statusUrl": "http://192.168.10.100:8000/v1/jobs/job_3e82f35ad0604f30"
}
  • Sciezki sa relatywne do storage/inputs/.
  • Mozesz tez mieszac, na przyklad imagePath z audioUrl, byle nie dublowac tego samego pola.
POST /v1/singing-visualizer/jobs

FFmpeg: singing visualizer z intro video

Dedykowany flow do prostych klipow wokalnych: intro video przechodzi do statycznego zdjecia z petla overlay wizualizera.

Curl

curl -X POST http://192.168.10.100:8000/v1/singing-visualizer/jobs \
  -H 'Content-Type: application/json' \
  -d '{
  "introVideoPath": "videos/kasandra-intro.mp4",
  "stillImagePath": "people/kasandra/hero.jpg",
  "audioPath": "music/kasandra-single.mp3",
  "overlayVideoPath": "loops/kasandra-visualizer.mp4",
  "blackThreshold": 2,
  "output": {
    "width": 1080,
    "height": 1920,
    "fps": 30,
    "format": "mp4"
  },
  "timing": {
    "introVideoSeconds": 3,
    "fadeSeconds": 1
  }
}'

Body

{
  "introVideoPath": "videos/kasandra-intro.mp4",
  "stillImagePath": "people/kasandra/hero.jpg",
  "audioPath": "music/kasandra-single.mp3",
  "overlayVideoPath": "loops/kasandra-visualizer.mp4",
  "blackThreshold": 2,
  "output": {
    "width": 1080,
    "height": 1920,
    "fps": 30,
    "format": "mp4"
  },
  "timing": {
    "introVideoSeconds": 3,
    "fadeSeconds": 1
  }
}

Przykladowa odpowiedz

{
  "id": "job_3e82f35ad0604f30",
  "status": "queued",
  "statusUrl": "http://192.168.10.100:8000/v1/jobs/job_3e82f35ad0604f30"
}
  • Dla kazdego assetu mozesz podac pole Url albo Path.
  • Mozesz mieszac URL-e i lokalne sciezki w jednym jobie, byle nie dublowac Url i Path dla tego samego assetu.
  • introVideo moze byc z URL albo z lokalnej sciezki wewnatrz storage/inputs/.
  • stillImage zostaje na ekranie do konca audio i dostaje koncowy fade out.
  • overlayVideo zapetla sie nad zdjeciem i usuwa czarne tlo przez colorkey.
  • blackThreshold jest na skali 0-10. Domyslnie 2 i im wyzej, tym agresywniej wycinana jest czern.
  • Ten endpoint sluzy do prostych klipow wokalnych bez potrzeby budowania pelnego timeline.
POST /v1/singing-visualizer/jobs

FFmpeg: singing visualizer z mieszanymi zrodlami

Ten sam flow, ale z mieszaniem URL-i i lokalnych sciezek w jednym jobie.

Curl

curl -X POST http://192.168.10.100:8000/v1/singing-visualizer/jobs \
  -H 'Content-Type: application/json' \
  -d '{
  "introVideoUrl": "http://nas.local/assets/kasandra-intro.mp4",
  "stillImagePath": "people/kasandra/hero.jpg",
  "audioPath": "music/kasandra-single.mp3",
  "overlayVideoUrl": "http://nas.local/assets/kasandra-visualizer.mp4",
  "blackThreshold": 2,
  "timing": {
    "introVideoSeconds": 3,
    "fadeSeconds": 1
  }
}'

Body

{
  "introVideoUrl": "http://nas.local/assets/kasandra-intro.mp4",
  "stillImagePath": "people/kasandra/hero.jpg",
  "audioPath": "music/kasandra-single.mp3",
  "overlayVideoUrl": "http://nas.local/assets/kasandra-visualizer.mp4",
  "blackThreshold": 2,
  "timing": {
    "introVideoSeconds": 3,
    "fadeSeconds": 1
  }
}

Przykladowa odpowiedz

{
  "id": "job_3e82f35ad0604f30",
  "status": "queued",
  "statusUrl": "http://192.168.10.100:8000/v1/jobs/job_3e82f35ad0604f30"
}
  • Worker obsluguje URL-e i lokalne sciezki w ramach jednego requestu.
  • Kazde pole assetu ma pare Url/Path, ale dla jednego assetu wybierasz tylko jedno pole.
  • To jest wygodne, gdy audio i zdjecia trzymasz lokalnie, a intro albo overlay pobierasz z zewnatrz.

Render Vertex AI

Te endpointy obsluguja generacje wideo Veo oraz obrazow Nano Banana Pro.

POST /v1/jobs

Vertex Veo: generacja MP4

Asynchroniczny job wideo przez Google Vertex AI Veo.

Curl

curl -X POST http://192.168.10.100:8000/v1/jobs \
  -H 'Content-Type: application/json' \
  -d '{
  "renderer": "vertex-veo",
  "vertex": {
    "prompt": "Cinematic drone shot over a quiet lake at sunrise, gentle mist, realistic lighting",
    "negativePrompt": "overexposed, blurry, text, watermark",
    "referenceFolderPath": "people/alicja-veo",
    "durationSeconds": 8,
    "aspectRatio": "16:9",
    "resolution": "720p",
    "generateAudio": false,
    "personGeneration": "dont_allow"
  }
}'

Body

{
  "renderer": "vertex-veo",
  "vertex": {
    "prompt": "Cinematic drone shot over a quiet lake at sunrise, gentle mist, realistic lighting",
    "negativePrompt": "overexposed, blurry, text, watermark",
    "referenceFolderPath": "people/alicja-veo",
    "durationSeconds": 8,
    "aspectRatio": "16:9",
    "resolution": "720p",
    "generateAudio": false,
    "personGeneration": "dont_allow"
  }
}

Przykladowa odpowiedz

{
  "id": "job_3e82f35ad0604f30",
  "status": "queued",
  "statusUrl": "http://192.168.10.100:8000/v1/jobs/job_3e82f35ad0604f30"
}
  • Dla renderer=vertex-veo nie wysylasz pol imageUrl, imagePath, audioUrl, audioPath, loopVideoUrl ani loopVideoPath; referencje obrazowe przekazujesz przez vertex.referenceFolderPath.
  • Folder referencji musi byc relatywny do storage/inputs/, moze miec maksymalnie 3 obrazy i tylko MIME: image/png, image/jpeg. W tym trybie durationSeconds musi wynosic 8.
  • Wspierane proporcje: 16:9, 9:16. Rozdzielczosci: 720p, 1080p.
  • Worker czeka do 300s na pojedynczy request do Vertex i ponawia do 2 prob.
  • Jesli Vertex zwroci raiMediaFilteredReasons, job konczy sie czytelnym error z powodem filtrowania zamiast ogolnego bledu o braku video.
GET /v1/nano-banana-pro/config

Nano Banana Pro: konfiguracja runtime

Szybki odczyt modelu, lokalizacji, limitu referencji i wspieranych proporcji obrazu.

Curl

curl http://192.168.10.100:8000/v1/nano-banana-pro/config

Przykladowa odpowiedz

{
  "renderer": "vertex-nano-banana-pro",
  "model": "gemini-3-pro-image-preview",
  "location": "global",
  "maxReferenceImages": 14,
  "defaultImageSize": "1K",
  "supportedImageSizes": [
    "1K",
    "2K",
    "4K"
  ],
  "supportedAspectRatios": [
    "1:1",
    "3:2",
    "2:3",
    "3:4",
    "4:3",
    "4:5",
    "5:4",
    "9:16",
    "16:9",
    "21:9"
  ],
  "defaultOutputFormat": "png",
  "supportedOutputFormats": [
    "png",
    "jpg"
  ],
  "supportedMimeTypes": [
    "image/png",
    "image/jpeg",
    "image/webp",
    "image/heic",
    "image/heif"
  ],
  "referenceFolderBasePath": "storage/inputs"
}
  • To jest najlepszy punkt startowy do odczytu aktualnych limitow bez czytania .env.
  • Limit obrazow referencyjnych jest wymuszany zarowno przez API, jak i worker.
  • Worker czeka do 300s na pojedynczy request do Vertex i ponawia do 2 prob z backoffem od 3s.
  • W tym samym miejscu widać tez domyslny i wspierane rozmiary obrazu oraz outputFormat dla pliku wynikowego.
POST /v1/nano-banana-pro/jobs

Nano Banana Pro: generacja obrazu

Tworzy job obrazu z promptem i wszystkimi referencjami z jednego folderu.

Curl

curl -X POST http://192.168.10.100:8000/v1/nano-banana-pro/jobs \
  -H 'Content-Type: application/json' \
  -d '{
  "prompt": "Generate a photorealistic portrait of the same adult person wearing a dark green sweater, soft daylight, neutral studio background, no text.",
  "referenceFolderPath": "people/alicja",
  "aspectRatio": "4:5",
  "imageSize": "2K",
  "outputFormat": "jpg"
}'

Body

{
  "prompt": "Generate a photorealistic portrait of the same adult person wearing a dark green sweater, soft daylight, neutral studio background, no text.",
  "referenceFolderPath": "people/alicja",
  "aspectRatio": "4:5",
  "imageSize": "2K",
  "outputFormat": "jpg"
}

Przykladowa odpowiedz

{
  "id": "job_3e82f35ad0604f30",
  "status": "queued",
  "statusUrl": "http://192.168.10.100:8000/v1/jobs/job_3e82f35ad0604f30"
}
  • Folder musi byc relatywny do storage/inputs/.
  • Aktualnie obslugiwane proporcje: 1:1, 3:2, 2:3, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9, 21:9.
  • Aktualnie obslugiwane rozmiary obrazu: 1K, 2K, 4K.
  • Aktualnie obslugiwane outputFormat: png, jpg. Domyslnie png.
  • Worker czeka do 300s na pojedynczy request do Vertex i ponawia do 2 prob.
  • Jesli poprosisz o jpg, worker zapisze finalny plik jako JPEG nawet gdy model odda inny wspierany format obrazu.
  • Jesli pomylisz metode i wywolasz GET zamiast POST, API zwroci 405 z instrukcja poprawnego wywolania.

Status i wynik

Po stworzeniu joba zawsze wracasz tutaj, zeby sprawdzic postep i pobrac plik wynikowy.

GET /v1/jobs/{job_id}

Status joba

Wspolny endpoint do sprawdzania postepu i finalnego downloadUrl dla kazdego renderera.

Curl

curl http://192.168.10.100:8000/v1/jobs/job_3e82f35ad0604f30

Przykladowa odpowiedz

{
  "id": "job_3e82f35ad0604f30",
  "status": "completed",
  "progress": 100,
  "downloadUrl": "http://192.168.10.100:8000/downloads/job_3e82f35ad0604f30.png",
  "error": null,
  "createdAt": "2026-04-24T08:00:00Z",
  "updatedAt": "2026-04-24T08:01:05Z"
}
  • Ten sam endpoint obsluguje ffmpeg, Veo i Nano Banana Pro.
  • Po wyczerpaniu retry pole error zwraca czytelny opis timeoutu, HTTP albo problemu zapisu.
  • Mozliwe statusy sa opisane w sekcji Lifecycle ponizej.
GET /downloads/{filename}

Pobranie gotowego pliku

Statyczny endpoint do pobrania MP4 albo obrazu zapisanego przez worker do storage/outputs/.

Curl

curl http://192.168.10.100:8000/downloads/job_3e82f35ad0604f30.png
  • Link do pobrania pojawia sie dopiero po status=completed.
  • Sciezka jest budowana automatycznie przez API i zwracana jako downloadUrl.