Fully Automate YouTube Thumbnail Uploads with n8n and n8n-nodes-thumbapi (Step by Step)

How to Fully Automate YouTube Thumbnail Uploads with n8n

A complete walkthrough — Google Cloud OAuth2 setup, n8n credential wiring, and a paste-ready workflow that generates a thumbnail from your latest video’s title and pushes it directly back to YouTube via Google’s Resumable Upload protocol. No manual design step, no manual upload.

The workflow uses the n8n-nodes-thumbapi community node to render the image, and the YouTube Data API v3 to swap the thumbnail on the live video.

Step 1: Create a Google Cloud Project

Before we touch anything inside n8n, we need a Google Cloud project so we can issue an OAuth2 client for n8n.

Important: create the project from the same Google account that owns your YouTube channel. If the accounts don’t match, the OAuth tokens won’t have permission to modify your videos.

  1. Open the Google Cloud Console welcome page.
  2. In the top navigation bar, click the project dropdown. If you already have projects, click New Project; if this is your first one, you’ll see the option immediately.
  3. Enter a project name — it isn’t critical, e.g. youtube-auto-thumbnails — and click Create.
  4. If you have multiple projects, select this new one from the top nav dropdown.

Step 2: Open APIs & Services

From the Cloud Console dashboard, open APIs & Services (search for it in the top search bar if you don’t see it in the side menu).

APIs & Services entry point in the Google Cloud Console dashboard

Then go to Credentials → Create Credentials → OAuth client ID.

The first time you try to create an OAuth client, Google blocks you with: “To create an OAuth client ID, you must first configure your consent screen.” Click Configure consent screen, then Get started.

Step 3: Configure the OAuth Consent Screen

You’ll be walked through a short form. Fill it in exactly like this:

  1. App information — enter an app name and the support email (your Google account email).
  2. Audience — pick External. This is for personal channel automation, not an internal Workspace app.
  3. Contact info — your email again.
  4. Check the data policy box and click Create.

After saving you’ll land on a screen confirming the consent setup. Click Create OAuth client to continue.

Step 4: Create the OAuth 2.0 Client

Now we issue the actual Client ID + Client Secret that n8n will use.

  1. Application type — choose Web application.
  2. Authorized JavaScript origins — this depends on where n8n runs:
    • n8n Cloud / self-hosted on a domain: paste your instance URL, e.g. https://n8n.yourdomain.com
    • Local n8n: http://localhost:5678/
  3. Authorized redirect URIs — take whatever you entered above and append /rest/oauth2-credential/callback. So:
    • Local: http://localhost:5678/rest/oauth2-credential/callback
    • Cloud: https://n8n.yourdomain.com/rest/oauth2-credential/callback

OAuth client creation form — Web application type with Authorized JavaScript origins and redirect URI fields

Click Create. A modal pops up with your Client ID and Client Secret.

Save these now. Either download the JSON or copy both fields somewhere safe — you’ll need them in Step 6 when wiring n8n.

Step 5: Add Yourself as a Test User and Enable the YouTube API

Two small but mandatory steps before the API will actually answer.

Add yourself as a test user

Back on the OAuth screen, open Audience in the left sidebar. Under Test users, click Add users and add the Google account email you use for YouTube.

Audience screen with the Test users section where you add your Google account email

The 403 Forbidden bypass. Skip this step and Google blocks your n8n login with 403 Access Denied the moment you try to authorize. It’s the single most common reason this integration “doesn’t work” for people.

Enable YouTube Data API v3

In the top search bar, type YouTube Data API v3 and pick it from the dropdown.

YouTube Data API v3 page in Google Cloud Console with the Enable button

Click the blue Enable button. The project is now allowed to talk to YouTube on your behalf.

That’s the Google side done. Now into n8n.

Step 6: Wire Google OAuth2 into n8n

Tip for local n8n: open n8n in an incognito tab before doing this. Logged-in Google session cookies in your main browser can hijack the OAuth handoff and silently use the wrong account.

In your n8n instance:

  1. Click + in the top-right corner and choose Add credential.

  2. Pick Google OAuth2 API and click Continue.

  3. Paste the Client ID and Client Secret you saved in Step 4.

  4. In the Scope field, set:

    https://www.googleapis.com/auth/youtube
    
  5. Click Sign in with Google at the bottom.

A Google auth screen will open. Pick the account that owns your YouTube channel — this needs to be the same email you added as a test user in Step 5.

Google account picker shown during the n8n OAuth handshake

You’ll see a yellow warning that “Google hasn’t verified this app.” That’s expected — your app is in testing mode. Click Continue, or Advanced → Go to app (unsafe), and approve all requested permissions.

You should end up back in n8n with a green Connection successful banner and Account connected under the credential.

Step 7: Install the ThumbAPI Community Node

The workflow uses a dedicated n8n community node so you don’t have to hand-craft HTTP requests for the image generation step.

  1. In n8n, open Settings (bottom-left) → Community Nodes.

  2. Click Install in the top-right.

  3. In the npm package field, enter:

    n8n-nodes-thumbapi
    
  4. Tick the data policy checkbox and click Install.

n8n Community Nodes install dialog with n8n-nodes-thumbapi entered as the package name

n8n will pull the package and the ThumbAPI node will appear in the node palette.

Step 8: Paste the Workflow

Everything is in place — now drop in the pipeline. Download the workflow JSON (recommended — avoids any copy-paste mangling), open the n8n canvas, click on the empty grid and press Cmd + V (or Ctrl + V) to paste the whole workflow at once.

Full n8n workflow on the canvas after pasting the JSON — all nodes connected end to end

Resolving the orange credential warnings

When you paste an external workflow, n8n shows an orange icon on the HTTP-Get upload link node and the Generate a thumbnail node. That’s a built-in security behavior — the JSON never carries secrets across machines. You just need to bind your local credentials.

  • HTTP-Get upload link → open the node, in the credential dropdown pick the Google account you authorized in Step 6.
  • Generate a thumbnail → open the node, in the credential dropdown choose Create New Credential.

Testing mode: in the ThumbAPI credential, paste thumbapi_test as the API key. This test key bypasses billing and always returns the same placeholder image — perfect for verifying the pipeline end-to-end without registering.

Production mode: for branded thumbnails matched to your video title, you’ll need a ThumbAPI key — the free tier (50 credits/month, no card required) is enough to keep a small channel running. Sign up at app.thumbapi.dev/signup and paste the key into the credential.

Step 9: Set Your YouTube Channel ID

One last thing before you can test. Open the second node — Input values — and replace the placeholder in the ChanelId field with your actual YouTube channel ID.

You can find your channel ID in two places:

  • YouTube Studio → Settings → Channel → Advanced settings
  • Inside your channel’s public URL (the UC... string)

Paste it in, save, and you’re ready to run.

How the Pipeline Works Under the Hood

When the workflow runs, this is what’s actually happening:

  1. Fetch latest video data. The workflow hits your channel’s public RSS feed (https://www.youtube.com/feeds/videos.xml?channel_id=``...) to pull your most recent uploads.
  2. Filter & extract. A small JavaScript node strips out YouTube Shorts to isolate long-form uploads, and extracts the videoId and title for the most recent one.
  3. Generate the thumbnail. The ThumbAPI node takes the raw title string and renders a .png thumbnail.
  4. Resumable upload handshake. The workflow POSTs to Google’s upload endpoint, declaring the exact byte size of the incoming image. Google replies with a temporary streaming URL in the location response header.
  5. Binary PUT. The final node PUTs the raw image bytes to that location URL, and YouTube swaps the thumbnail on the live video in place.

Customizing the Output

This workflow always operates on the most recent video in the feed, which makes it the natural tail to chain onto a video-upload workflow. Once your upload step finishes, fire this one — and the thumbnail attaches itself within seconds of the video going public.

If you want to personalize the visual style further — embed a profile photo, drop in a brand logo, or pick a custom asset set — you don’t need to touch the workflow. Toggle Profile photo: on inside the ThumbAPI node, or configure assets visually in the ThumbAPI dashboard.

Workflow JSON

Recommended: download workflow.json and paste it from there. Copying directly from a rendered code block can occasionally introduce smart-quote or escape-character artifacts depending on your browser, which break the n8n import.


Originally published with full formatting at thumbapi.dev/blog/n8n-youtube-auto-thumbnails.

4 Likes

The Shorts filter in the RSS parsing step is a nice touch - that’s a detail a lot of YouTube automations miss and it causes weird issues with thumbnail sizing. You could extend this further by hooking up a YouTube Data API trigger (via HTTP Request polling) instead of RSS, which gives you access to the full video metadata immediately after upload rather than waiting for the feed to update.

1 Like

Good point. I actually explored the Data API approach first, but for this use case it ended up adding a lot of complexity. Since videos.update requires sending the full snippet back thumbnail + (title, description, category, tags, etc.), I would have had to fetch and preserve all existing metadata just to avoid overwriting fields accidentally. For a workflow whose only purpose is replacing the thumbnail, that felt like unnecessary overhead, so I opted for the simpler RSS-based approach.
So i simply get the upload for thumbnail just update the thumbnail for it. OFC there is a lot of space for optimization (error handling or attaching it to some automatic trigger where it every hour checks the difference of uploaded videos and takes the last uploaded if appears to attaach thumbnail) but core ide-a i belive is covered.

Update: I also recorded a full video walkthrough of this workflow if you prefer visual