Home/Insights/Automation

How I Automated Faceless Shorts with AI (SORA2) in n8n (free template) - 2026

By Ani BjörkströmPublished 14 October 2025Reviewed 20 September 202620 min video + articleAutomation

How I Automated Faceless Shorts with AI (SORA2) in n8n (free template) - 2026
▶ Watch the full 20-minute tutorial · free on YouTube

AUTOMATION

How do you fully automate faceless Shorts with Sora 2 and n8n?

In short: A schedule trigger fires the workflow daily at 11:00, and an AI agent writes a fresh Sora 2 video prompt each run — checking a Google Sheet of past titles and prompts so it never repeats an idea.

Key takeaways

  • A schedule trigger fires the workflow daily at 11:00, and an AI agent writes a fresh Sora 2 video prompt each run — checking a Google Sheet of past titles and prompts so it never repeats an idea.
  • The workflow calls the OpenAI video API directly, with no third-party middleman: the create, retrieve and content endpoints come straight from the documentation, and the curl example can be imported into n8n's HTTP node.
  • Instead of hammering the status endpoint, a one-minute wait node polls for completion, which saves computational resources.

This n8n workflow produces faceless YouTube Shorts on autopilot: it invents a video idea, logs it, sends it to Sora 2, waits for rendering, and downloads the MP4 — every day, without a human in the loop. Ani Björkström, a tech consultant based in Stockholm, shares the full template free to anyone who comments on the video.

How does the workflow decide what each video is about?

An Edit Fields node holds the creative brief as variables, and an AI agent turns that brief into a concrete video prompt. The variables are the general idea (stories about a little cat), a sample prompt, the aspect ratio (9:16 for Shorts), and the number of videos per run — one. The agent's system message sets the ground rules: guidelines, an example of good output, the required JSON notation, a "think" tool for harder reasoning, and access to a Google Sheet of previous ideas. The user message simply drags in those variables, so nothing is hardcoded.

Why log every video to Google Sheets?

The sheet is the workflow's memory: it stores title, caption, video prompt and aspect ratio for every clip generated, and the agent reads it before writing a new prompt so ideas never repeat. Connecting it requires credentials from console.cloud.google.com: enable the Google Sheets API under APIs and services, then create an OAuth client (web application) to get a confidential client ID and secret for n8n. The workflow then uses an append-row operation, so each new video lands as a new row on sheet one.

How is the Sora 2 API actually called?

Through a separate sub-workflow that does nothing but take the prompt and size and post them to OpenAI — a deliberate split, so the idea-generation half can be reused with other video APIs later. The HTTP node sends a POST to the create-video endpoint from platform.openai.com's documentation, authenticated with a header credential whose value is "Bearer", a space, then the API key. The JSON body carries the model, the prompt, the length (8 seconds) and the size suited to Shorts and TikTok; the size can be a variable rather than hardcoded.

How does the workflow know the video is ready?

By polling. Sora 2 first returns a video ID with status "queued", so the workflow waits one minute, calls the retrieve-video endpoint with that ID, and routes the result through a switch node.

Switch outcomeWhat the workflow does
CompletedCalls the content endpoint with a GET request and downloads the MP4
Not completedReturns to the wait node for another minute, then checks again
Fallback (anything else)Saves the outcome to an error node for logging

Once downloaded, the video can be saved locally or published straight to social media accounts.

FAQ

Why wait a minute instead of checking constantly?

Checking every second wastes computational resources. This wait-then-check pattern is called polling, and one-minute intervals are enough here.

Can the workflow make more than one video per run?

Yes. Set the number-of-videos variable higher and the split-out node separates each result so every video gets its own Google Sheet row and API call.

How often can it run?

The schedule trigger is set to daily at 11:00, but the interval can be hourly, weekly or monthly, and you can set the exact minute.

Full transcript of the video (3,265 words, 22 sections)

0:09 Hey, my name is Ani Bstram. I am a tech consultant based in Stockholm. And in this video, I will show you how to use SU in N8N and you will get this template for free. just comment down below n and you will get a link that you can use to download this template for free. So the first module that we have in our workflow is schedule trigger. If we double click on schedule trigger we can see that here I specified trigger interval and there you can see days which means that this interval means days for the trigger to be fired and then you can see that we will have it running daily. So there will be only one day between days and also we define that the time should be 11:00 and if you like you can even specify trigger at minute which means that for example if you want to run this at half uh 11 then you will just write 30 here.

1:09 So it will be 11:00 a.m. and then 30 minutes. And of course you can change this. You can have for example hours if you want to create videos on hourly basis or weeks if you want just to create one video per week or months. So it's up to you. Then in the next step we have edit fields and what we do basically here is that we are creating variables and if you don't know what is a variable no worries you are just specifying for example different fields. The first field is what is your idea and the general idea what you want your videos to be about. For me it's stories about a little cut and so that's why I specified that my general idea should be about little cut. Then sample chrome.

1:55 This will be a chrome that you will just give as a sample to your AI agent. Then you have aspect ratio. So here I have 916 because I want to create shorts for YouTube. But it's up to you. You can just define the aspect ratio that you would like to define. And the number of videos the idea for me is that I will create one video every time this workflow is fired. So that's why I have just one here. And also you can see that as any other action or module in NAM we have input section and we have output section. So input section is everything that we get from the action that was before edit field. So that was a schedule trigger for us and you can see that it was scheduled on 12th of October.

2:43 You can see the time and then you can see for example day of the week it was Sunday and the year and all of this information that is coming as input for our current edit field module and then we have the output and output is what edit field is putting out after it was executed. So then it is those values that we are specifying in this edit field action. So we have the idea that we specified here sample pro that we specified in edit fields and then aspect ratio of course and the number of videos. That's it. And then in the next step what we will do we will define an I agent. And if I double click on this you can see that it's just a general I agent in N8N.

3:33 And here again as an input field we have everything that we specified in edit field action. And what we are doing here we are defining user message or prompt and we are defining system message in order to understand what exactly is user message. So if for example if you log in into chat GPT cloud complexity and you write a prom then that is the chrome that we will insert in here and everything that is in system messages. This is like a setup that is sent to your LLM before the prompt. So here we specify general setup for your LLM. And if I try to you can see that what I'm doing here I am saying a ask and then suggest detailed video prompts based on the user's input.

4:24 Then I have guidelines under that I have examples. So I'm giving an example to LLM so that it will create needed output. Then I have notations how the output needs to like look like because I want it to be a JSON and then after that I'm even giving a tool. So I'm saying that think tool and I'm giving it a memory to think a bit harder. Then I'm giving even a Google sheet that my LLM needs to use to see what are the other ideas that it created before in order not to repeat the same ID and the same prompt for the video game. So that's basically what we specify is the message. And then we have also a user message. And here you can see that I'm using our input par parameter.

5:12 So I say give the number of videos video idea about and then there I'm specifying the idea that we defined and then after that I'm specifying the aspect ratio. So it is basically referring the aspect ratio that we specified in edit field. So all of those for example aspect ratio this is like a variable you drag and drop it in here. The same with number of videos just drag and drop it in here. You don't need to write this JSON code. is just drag and drop it and that's it. Basically your I agent is created at least for this part and then if we come out of that you can see that I gave a brain to our IE agent you can choose the LLM that you like if you have access to complexity or chat just use that one and then you specify credential to connect with.

6:02 So this will be basically the your API key for the platform. Next what I'm doing in here I gave my I agent memory is the name of this inn is pink and then after that you can see that I have another tool which is Google sheets and here you can see the Google sheet that I am attaching to our I agent and here you can see that in my Google sheet I have title caption video prompt and if I scroll a bit more you can see that even have aspect ratio and the idea with this is our I agent we look into this Google sheet, we'll see all the other titles in prompt for the previous video ideas and we will not create the same video idea about our sweet cut.

6:49 That's why we are specifying this as a tool. Then in the next step I'm specifying also a partial and because the reason I do this is because I want to specify in which format should the output be and you can see that input was already more or less good format but I'm still specifying that output needs to be exactly in this format. So it needs to have a title, caption, prompt, aspect ratio. And you might ask why it is so important to have this in this certain format and why should I have JSON? The reason that we need this because later on we will send this information to Sura 2 API and Sura 2 API is accepting input in a certain format and this is the format that sur is accepting.

7:36 If we send in other format then it will not understand and it will not create a video. So that's the reason if I double click on that I would like to show this for you. So you can see that what we do in the credentials section we are specifying our credentials and if you don't create your credentials yet and you just we click on this pen button here you can see all the credentials that I specified and you might be asking how should you fix this console cloud google.com and from there actually the first thing is that you will choose APIs and services and and enable APIs and services and we come here is because you need to enable your API for Google sheet.

8:23 So this is the API if I click on this. So the option that I can choose here is disabled. If it's not enabled then you need to come here in order to be able to use Google sheet programmatically or via API. And then once you do that next step is that you will go to credentials and once you are in credentials then you will create credentials and from there you will choose our client ID and then from here application type will be web application and then you will just click on create and once you create this you can see your client ID and client secret and that is exactly what you will be using in your N8 and this information is confidential.

9:14 So you don't need to share this with somebody else. That's how you will create your Google sheet account credentials. So you will fill in all redirect URL and then client ID, client secret and that's it. And after that you have tool description that will be set automatically and then resources will be sheet within documents and then operation will be append row because in your Google sheet you will append row or your information which is the title and caption and video chrome they will be that will be saved as a new row. So that's why you choose append row. Then here is the name of your Google sheet and then you are also saying that in my Google sheet choose the first sheet and this is you can see sheet number one you can add many different sheets but we are specifying that it needs to choose the sheet one again if we come back then you can see that I'm doing manual mapping and you can see that I have mapped my title from input so here you have the title for example to my Google sheet and you can also see that the aspect ratio and mapping that one and why am I not mapping the captions or the title actually and captions is enough to see if this video already exist in that Google sheet or not and in this step we are just checking to see if this video exist in Google sheet or not so that's why we are just mapping those two informations if we come out of that then we have split out action module and here you can see that all videos created then separate And in this case because in edit field I just choose one video.

10:58 So there will be one video. So we we will have just one output. But if we want to create two videos at once then we will separate and we will have two items here. The reason uh that we do that again is because in the next step we do append row in the sheet and this is the same Google sheet again from before and we want basically for every output we want to create new sheet that is why we were splitting outputs in the step before but now if we concentrate on append row in sheet module so here we can see that we are taking information from split out and we are inserting this information as a new row in our Google sheet and we have the title, caption, video and aspect ratio and everything will be written for you in this module.

11:52 If we come out of this next we will have call sora sub workflow and this is another workflow that will be called when append draw in sheet is succeeded and the reason that we do this that way is because we can use the first part of this worksheet with other APIs as well. So we want to separate the part where an API is used so that we can use the first worksheet for different APIs workflow. If we double click on the sub workflow, you can see that the only thing sub workflow does it gets input from the previous workflow and it sends the input to the next node. And here we have video prompt and size. And if we come out of that and we doubleclick to the next node in this workflow, you can see that it is HTTP request node.

12:44 And here we are using directly open API instead of using third party supplier for example FI or KI we are using directly open API. And here you can see open API documentation. So if you just open platform.open.com openi.com and then go to create video. Then you have a really nice documentation. So you can see that this is the endpoint that you need to use for post request and you can basically just copy curl code and if you go back to nn you can just import curl code here. So you can just paste it here and most of the sections will be out of field. But I can show you exactly what we are doing in here. So we have the method that is post and under that we have the URL which is the endpoint for creating the video directly via open I API and then under that we have authentication which is generic credential type and generic out type which should be header off and then under header off we created our credentials and here if I for example let's say if I want to show you how to do that then under the name You will enter authorization and value should be barrier then there should be space and then after that will be your API key and if you go to to authentication part of API documentation you can see that it specifies how exactly authentication should be done.

14:17 So here you can see that it says that in the header host is for the header. It should be authorization and then barrier and then the API key. Just remember that in N8N in the value you should also have barrier and then space and API key. Not only the API key but barrier space API key and API key you are creating in your openi.com platform. So that's where you will create that body content type is JSON and specify body is using JSON and then this is the content in the body that I'm using. We have the model we have prompt second it's eight which means that video will be 8 seconds and then the size is the size that is relevant for YouTube shorts or Tik Tok.

15:11 And here you can see I hardcoded that one. But you can even just drag and drop it from the input period. So in that case you will have that as a variable. If I do this for example. So you can see that now we have that as a variable. And we can just delete this hardcoded part. And then if we go out of this you can see that the output will be ID which is the ID of the video that was created. And then status in the beginning will be cute which means that video is not yet created but it is standing in the queue. And for that reason we will create another node that will wait 1 minute here. If I open that you can see that that this one will just wait 1 minute until trying to get the video. And the reason that we are waiting instead of just trying to get the status is just to save some computational resources.

16:01 Of course, we can check the status every second. But if we want to save some computational resources and do not try to check the status every other second, but wait one minute and then check and then do wait 1 minute and then check. Then we can say some computational resources and this process in computing is called polling. Then after that we have our next note which is called get video. In this section, what we will do basically we will check the status. So if we go back to API documentation here, if we scroll down, you can see we have one section that says retype video and there we are getting the video.

16:47 You can see that we are sending get request to the endpoint and you can see that the last part of the endpoint is video id and we get video id when we send our post request to create the video. So if I double click on get video you can see that this is another HTTP request and we are sending the get method. Then we can see URL which is again coming from the documentation and the ID is just the ID that we got from post request and then we have the same authentication. So we will use exactly the same authentication and yes and then after that I have the switch note and the reason I have the switch note is because we can have different outcomes when we try to get the status.

17:34 For example, we have an outcome where status will be completed. And if we get status completed, then we are ready to get the video. But if the status is not completed, this means that is still being produced. So then we will go back to our wait node and we will wait one minute and we will try to get the video again. And then we have a fallback option and fall back means that none of the options that are above are fulfilled. So it is falling back on the last fallback option. So again now if we go back from this node we can see that if there is a fallback option then we have another node that is called error and here we are just saving the outcome for logging purposes.

18:19 But if everything is fine and video was created and the status is success then we have another note which is HTTP request and here we are downloading the video. We are sending the get request and we are getting the content. So the endpoint will end with content. And again a question how do I know that we need to use exactly this endpoint I will specify that is coming from the API. So if I scroll down here the API documentation you can see that there is retrive video content and you can see that it specifies that we need to send get request and this is the endpoint that we need to use. So that is basically it and if we run all of this workflow we will get back the video and we can save it either locally or of course you can just directly go ahead and publish it on your social media accounts.

19:14 So again this workflow is free you I will send it you for free just comment anything down below in the comments and like this video. I hope this was helpful. Have a good day. Bye.

Want this working inside your finance team?

Ani Björkström

Ani Björkström — founder of QvantX Sweden AB, a Stockholm consultancy building AI solutions for banks, asset managers and finance teams. Anthropic partner. Every article starts from a real client build, minus the confidential parts. LinkedIn →