Automatyczne rolki z n8n i API wideo - gotowy workflow
Gotowy workflow n8n do automatycznych rolek AI: temat z arkusza, prompt z modelu czatu, wideo z API, czekanie na wynik i zapis na Dysku Google.
Automatyczne rolki w n8n robisz z sześciu, siedmiu węzłów: harmonogram uruchamia workflow, model czatu pisze prompt do wideo, węzeł HTTP Request wysyła zadanie do API wideo, pętla z węzłem Wait czeka na wynik, a gotowy plik MP4 trafia na Dysk Google albo Telegram. Poniżej jest pełna konfiguracja węzeł po węźle dla API Jantarisa, z gotowymi ciałami zapytań do skopiowania. Jeden klucz API obsługuje tu i model czatu, i model wideo.
Co robi ten workflow
Codziennie o 7:00 workflow:
- bierze kolejny temat z arkusza Google (kolumna
temat, statusnowy), - prosi model czatu o angielski prompt do wideo 9:16,
- wysyła zadanie wideo do Seedance 2.5,
- co 30 sekund sprawdza status,
- pobiera gotowe MP4 i wrzuca je na Dysk Google,
- oznacza temat w arkuszu jako
gotowy.
Nie publikuje niczego sam. Rolki lądują w folderze, a ja je przeglądam i wrzucam ręcznie. Automatyczna publikacja bez podglądu to prosty sposób, żeby któregoś dnia wypuścić wideo z sześcioma palcami u dłoni.
Czego potrzebujesz
- n8n w chmurze albo na własnym serwerze (wszystkie węzły poniżej są w standardowej instalacji),
- konto w Jantarisie z doładowanym saldem i kluczem
sk-jt-...(rejestracja), - arkusz Google z kolumnami
tematistatus, - dostęp n8n do Arkuszy i Dysku Google (poświadczenia OAuth w n8n).
Krok 1: poświadczenie do API w n8n
Klucza nie wpisuję w każdym węźle osobno. W n8n tworzę jedno poświadczenie typu Header Auth:
| Pole | Wartość |
|---|---|
| Name | Authorization |
| Value | Bearer sk-jt-... |
Potem w każdym węźle HTTP Request wybieram Authentication → Generic Credential Type → Header Auth i to poświadczenie. Zmiana klucza to wtedy jedna edycja zamiast sześciu.
Krok 2: harmonogram i temat z arkusza
Schedule Trigger: Trigger Interval → Days, godzina 7.
Google Sheets (Get Row(s)): wybierasz arkusz, dodajesz filtr status = nowy, a w opcjach zaznaczasz zwrócenie tylko pierwszego pasującego wiersza. Jeden temat dziennie to jedna rolka dziennie.
Krok 3: prompt do wideo z modelu czatu
Węzeł HTTP Request:
- Method:
POST - URL:
https://jantaris.com/v1/chat/completions - Authentication: poświadczenie z kroku 1
- Send Body: JSON
{
"model": "gemini-3.8-flash",
"messages": [
{
"role": "system",
"content": "You write prompts for an AI video model. Output one English prompt, max 70 words, vertical 9:16, one continuous shot, describe camera movement, lighting and ambient sound. No text on screen, no spoken words."
},
{
"role": "user",
"content": "Topic: {{ $json.temat }}"
}
],
"temperature": 0.8
}Nazwij ten węzeł Prompt, bo będę się do niego odwoływać później. Endpoint jest zgodny z formatem OpenAI, więc odpowiedź czytasz tak samo: {{ $json.choices[0].message.content }}. Do tak krótkich promptów wystarcza szybki, tani model. gemini-3.8-flash kosztuje , a jeden prompt to kilkaset tokenów, więc koszt tego kroku jest pomijalny przy cenie wideo.
W prompcie systemowym zakazuję mowy i napisów. Polska mowa w modelach wideo wychodzi nierówno, a napisy w wideo AI często mają literówki. Tekst i lektora dokładam później w montażu.
Krok 4: zlecenie wideo
Drugi węzeł HTTP Request, nazwany Zlecenie wideo:
- Method:
POST - URL:
https://jantaris.com/v1/generate - Authentication: to samo poświadczenie
- Body (JSON, w trybie wyrażenia):
{
"model": "seedance-2.5",
"input": {
"prompt": {{ JSON.stringify($json.choices[0].message.content) }},
"duration": 10,
"resolution": "720p",
"aspect_ratio": "9:16",
"generate_audio": true
}
}JSON.stringify jest ważne. Prompt z modelu czatu może zawierać cudzysłowy albo nowe linie i bez tego n8n wyśle zepsuty JSON, a API odpowie 422.
API odpowiada od razu kodem 202 z polem id zadania i estimated_cost. Ta kwota jest blokowana na saldzie do końca generacji. Koszt 10-sekundowej rolki to dziesięciokrotność ceny za sekundę, czyli 10 × od 1,51 zł za sekundę.
Krok 5: pętla oczekiwania
Wideo generuje się od około minuty do kilku minut, więc potrzebna jest pętla:
- Wait - Resume: After Time Interval, 30 sekund.
- HTTP Request -
GET, URL:https://jantaris.com/v1/tasks/{{ $('Zlecenie wideo').item.json.id }}, to samo poświadczenie. (NazwaZlecenie wideoto nazwa węzła z kroku 4, zmień ją, jeśli nazwałeś go inaczej.) - Switch na polu
{{ $json.status }}. Wartośćsucceededprowadzi dalej do pobrania,faileddo powiadomienia o błędzie, a wszystko inne (queued,running) z powrotem do węzła Wait. - Ustawienia workflow - timeout wykonania 30 minut, żeby zawieszone zadanie nie kręciło się w nieskończoność.
Połączenie wyjścia Switch z powrotem do Wait n8n obsługuje bez problemu, to zwykła pętla.
Zadanie ze statusem failed nic nie kosztuje, blokada środków wraca w całości. W gałęzi błędu wysyłam sobie wiadomość na Telegramie z treścią {{ $json.error.message }} i zostawiam temat w arkuszu jako nowy, więc jutro spróbuje ponownie.
Wariant z webhookiem
Zamiast pętli możesz dodać do ciała zapytania z kroku 4 pole "webhook_url" z produkcyjnym adresem węzła Webhook z drugiego workflow. Jantaris wyśle tam POST z tym samym JSON-em co GET /v1/tasks/{id}, gdy zadanie się skończy. To lepsze przy wielu rolkach naraz, ale wymaga, żeby twoja instancja n8n była dostępna z internetu. Podpis żądania przychodzi w nagłówku x-jantaris-signature, opis weryfikacji jest w dokumentacji webhooków.
Krok 6: pobranie pliku i zapis
Link w odpowiedzi jest ważny ograniczony czas, dlatego pobieram plik od razu.
HTTP Request (pobranie):
- Method:
GET - URL:
{{ $json.output[0].url }} - Authentication: None (link do pliku nie wymaga klucza)
- Options → Response → Response Format: File, Put Output in Field:
data
Google Drive (Upload): Input Data Field Name: data, nazwa pliku np. {{ $now.toFormat('yyyy-MM-dd') }}_{{ $('Google Sheets').item.json.temat }}.mp4, folder Rolki/Do przejrzenia.
Google Sheets (Update Row): ustawiasz status na gotowy dla wiersza z kroku 2.
Cały przepływ w skrócie
| # | Węzeł | Co robi |
|---|---|---|
| 1 | Schedule Trigger | start codziennie o 7:00 |
| 2 | Google Sheets | pobiera temat ze statusem nowy |
| 3 | HTTP Request | /v1/chat/completions pisze prompt |
| 4 | HTTP Request | /v1/generate zleca wideo |
| 5 | Wait | czeka 30 s |
| 6 | HTTP Request | /v1/tasks/{id} sprawdza status |
| 7 | Switch | gotowe, błąd albo powrót do Wait |
| 8 | HTTP Request | pobiera MP4 jako plik |
| 9 | Google Drive | zapisuje rolkę |
| 10 | Google Sheets | oznacza temat jako gotowy |
Rozbudowa: obraz jako pierwsza klatka
Kiedy rolki mają mieć spójny wygląd, np. tę samą postać albo produkt, dokładam przed krokiem 4 generowanie obrazu. Węzeł HTTP Request z POST https://jantaris.com/v1/generate?wait=60 i ciałem:
{
"model": "nano-banana-pro",
"input": {
"prompt": {{ JSON.stringify($json.choices[0].message.content) }},
"aspect_ratio": "9:16"
}
}Parametr wait=60 sprawia, że odpowiedź przychodzi z gotowym obrazem, bez pętli. W ustawieniach węzła podnieś timeout do 130 sekund. Potem w kroku 4 dodajesz "image_url": "{{ $json.output[0].url }}" i Seedance animuje ten konkretny kadr. Uwaga: po dodaniu węzła z obrazem $json w kroku 4 wskazuje już na odpowiedź z obrazem, więc prompt pobierz po nazwie węzła czatu, np. {{ JSON.stringify($('Prompt').item.json.choices[0].message.content) }}. Obraz z Nano Banana Pro kosztuje od 0,439 zł za obraz, więc to niewielki dodatek do ceny wideo, a daje dużo większą kontrolę nad kompozycją.
Muzyka w tym samym workflow
Jeśli wolisz piosenkę zamiast dźwięku z modelu wideo, ustaw generate_audio na false i dodaj osobne zadanie do Mureka V9. Ten model generuje piosenkę z wokalem na podstawie tekstu: lyrics jest wymagane (zwrotki i refren oznaczasz znacznikami [Verse] i [Chorus]), a prompt z opisem stylu jest opcjonalny. Rozliczenie jest za utwór:
{
"model": "mureka-v9",
"input": {
"lyrics": "[Verse]\nRano kawa, szybki plan\nJeden klik i gotowy kadr\n[Chorus]\nLecimy dalej, nie ma stop",
"prompt": "upbeat minimal electronic pop, soft kick, positive mood, 100 bpm"
}
}To też zadanie asynchroniczne, więc albo osobna pętla, albo webhook. Piosenka jest zwykle dłuższa niż rolka, więc wideo i wybrany fragment muzyki łączę potem w montażu albo w ffmpeg. Pełne wyliczenie, ile kosztuje taka rolka z każdym elementem, jest w tekście ile kosztuje rolka z AI.
Typowe błędy w n8n
- 422 przy
/v1/generate: najczęściej zepsuty JSON przez cudzysłowy w prompcie (brakJSON.stringify) albo parametr spoza schematu modelu. Dozwolone wartości zwracaGET /v1/models/seedance-2.5. - 402: saldo niższe niż szacowany koszt. Doładowanie BLIK-iem działa od ręki.
- 401: w poświadczeniu brakuje słowa
Bearerprzed kluczem. - Pusty plik na Dysku: w węźle pobierania nie ustawiono Response Format na File.
- 429: zbyt wiele zapytań na minutę, np. gdy pętla ma Wait ustawiony na 1 sekundę. 30 sekund w zupełności wystarcza.
Ogólny opis integracji z n8n, Make i Zapier jest w dokumentacji no-code. Jeśli nie chcesz automatyzacji, a jedną rolkę na próbę, zrób ją ręcznie w Jantaris Studio.
FAQ
Czy n8n obsługuje API Jantarisa bez dodatkowych wtyczek?
Tak. Wystarcza standardowy węzeł HTTP Request z poświadczeniem Header Auth. Endpoint czatu jest zgodny z OpenAI, więc możesz też użyć węzłów OpenAI z własnym base URL https://jantaris.com/v1.
Jak długo trzeba czekać na wideo w workflow?
Zwykle od około minuty do kilku minut, zależnie od długości klipu i modelu. Pętla z Wait co 30 sekund albo webhook radzą sobie z tym bez problemu.
Ile kosztuje jedna automatyczna rolka?
Głównie wideo: długość w sekundach razy cena za sekundę, dla Seedance 2.5 to od 1,51 zł za sekundę. Prompt z modelu czatu kosztuje ułamek tej kwoty. Nieudane generacje nie są płatne.
Czy workflow może sam publikować rolki na Instagramie lub TikToku?
Technicznie tak, przez odpowiednie węzły lub API platform. Ja tego nie robię i nie polecam bez podglądu, bo wideo AI czasem wychodzi z błędami, które trzeba wyłapać przed publikacją.












