Cover for How to automate YouTube uploads with n8n, Make or Zapier

How to automate YouTube uploads with n8n, Make or Zapier

Automate YouTube uploads from a Drive folder or a sheet with n8n, Make or Zapier: one trigger, two HTTP requests to PublishQ, and the fields to map.

Oct 27, 202610 min readAlexandroAlexandro
Table of Contents

To automate YouTube uploads, use the HTTP step your automation tool already has. n8n, Make and Zapier can all call PublishQ's REST API with an API key, so a new video in a Google Drive folder, or a new row in a sheet, turns into a scheduled YouTube upload. Every flow has the same three steps: a trigger, two HTTP requests (upload the file, then create the post), and a handful of fields to map. You connect your channel to PublishQ once. There is no Google Cloud project to set up and no YouTube API quota to manage.

uploading youtube videos one by one manually

Why the flow calls PublishQ instead of YouTube

If you call the YouTube Data API yourself, you start with your own Google Cloud project and its default allocation of 100 videos.insert calls per day1. With PublishQ you skip the project, the OAuth client and the quota request. You create a key at publishq.com/app/api-keys and send it as Authorization: Bearer pq_live_....

The recipes below use the generic HTTP step, so they work in whichever of the three tools you already use. The PublishQ API page has the full reference.

The PublishQ calls every recipe uses

Base URL: https://publishq.com/api/v1.

StepRequestWhat you send
Once, by handGET /accounts?platform=YOUTUBENothing. Copy the id of your channel from accounts.
Upload (up to 100 MB)POST /mediaThe file as multipart/form-data, field name file
Upload (up to 4 GB)POST /media/uploads, then PUT to uploadUrlfilename, contentType, fileSize in bytes, then the raw file
PublishPOST /postsTitle, the media id, the account and a time

POST /media takes the file itself, so each recipe passes the video's file data from the trigger app to the request. Both uploads return a media id. The media uploads guide covers the storage route step by step, including the optional complete call.

The create-post body looks the same in every tool:

{
  "content": "Weekly build log: the new export pipeline",
  "mediaIds": ["e1d2c3b4-a5f6-4789-9012-3456789abcde"],
  "accounts": [{
    "accountId": "f0e1d2c3-b4a5-6789-0123-456789abcdef",
    "platformSpecificSettings": {
      "description": "Recorded on Friday. Links in the pinned comment.",
      "privacyStatus": "public",
      "categoryId": "28",
      "tags": ["build log", "automation"],
      "madeForKids": false
    }
  }],
  "scheduledAt": "2026-12-01T09:00:00Z"
}

content is the YouTube title, up to 100 characters, with no < or >. A longer title is refused, so trim it in the flow. Swap scheduledAt for "publishNow": true to post right away. If you leave both out, the video waits in PublishQ as a draft you can review first. Every field is documented under create posts and on the YouTube API page.

n8n: Drive folder to YouTube

n8n's HTTP Request node can call any REST API, send multipart/form-data with a file, and import a curl command straight into its fields2.

Trigger

Add a Google Drive Trigger and point Watch For at new files in your upload folder. It polls Drive once a minute by default, and several new files in one poll arrive as several items3. Follow it with a Google Drive node set to Download, mapped to the trigger's file ID, so the video is available as binary data under the name you set in Put Output File in Field4.

HTTP requests

Create a Header Auth credential with Name Authorization and Value Bearer pq_live_...5. Then add two HTTP Request nodes:

  • POST https://publishq.com/api/v1/media. Turn on Send Body, pick Form-Data, add one parameter of type n8n Binary File with Name file and Input Data Field Name set to your download field2.
  • POST https://publishq.com/api/v1/posts. Body Content Type JSON, Using JSON, and paste the body above with expressions in place of the values.

For files over 100 MB, use the storage upload: an HTTP Request to POST /media/uploads with a JSON body, then a PUT to the returned uploadUrl with Body Content Type n8n Binary File, a Content-Type header that matches, and no credential. fileSize must be the exact byte count, which Drive reports in the file's size field6.

Fields to map

PublishQ fieldMap from
mediaIds[0]id from the /media (or /media/uploads) response
contentDrive file name without the extension, or a sheet column
accountIdYour YouTube account ID, pasted once
scheduledAtA date column, or an expression such as tomorrow at 09:00 UTC

n8n make zapier http request youtube upload workflow

Make: Drive folder to YouTube

Trigger

Start the scenario with Google Drive > Watch Files in a Folder, set Watch Files to By Created Time and pick your folder7. Add Google Drive > Download a File after it, mapped to the file ID.

HTTP requests

Use the HTTP app's Make a request module twice. For credentials, pick the API key authentication type, put Bearer pq_live_... in Key, place it In the header, name it Authorization, and allow the origin https://publishq.com8.

  • Upload: URL https://publishq.com/api/v1/media, method POST, Body content type multipart/form-data, with one File item named file mapped to the downloaded file9. Set Parse response to Yes so the id is mappable later9.
  • Create post: URL https://publishq.com/api/v1/posts, method POST, Body content type application/JSON. The Data structure input method escapes quotes in mapped values for you, which helps when a title contains them9.

Check your Make plan before you send long videos. Make caps file size per plan, from 5 MB on Free up to 1,000 MB on Enterprise10. For files over 100 MB, the PublishQ side is the storage upload in the media uploads guide.

Fields to map

The same as n8n: the media id into mediaIds, the file name (or a cleaner title from a sheet) into content, your fixed accountId, and a time into scheduledAt. Add description and tags to the data structure if you set them per video.

Zapier: sheet row to YouTube

Zapier suits a sheet-driven queue: one row per video, with columns for title, description, publish time and the file.

Trigger

Use Google Sheets > New Spreadsheet Row. Zapier warns that this trigger can pick up a row while you are still typing it11, so fill in the row elsewhere and paste it in whole.

HTTP requests

Both use Webhooks by Zapier, with Authorization: Bearer pq_live_... in the Headers section12.

  • Upload: the POST event, because Zapier sends files through POST and PUT, and not through Custom Request12. URL https://publishq.com/api/v1/media, payload type Form, and map the file to the file key. A file column can hold a public direct-download link; Google Drive sharing links do not work as file URLs13.
  • Create post: the Custom Request event, method POST, because the body has nested arrays (mediaIds, accounts), which Zapier handles in Custom Request12. Paste the JSON body and map the row's columns into it.

Zapier caps webhook action payloads at 5 MB12 and says files over 100 MB may time out13. For anything beyond a short clip, upload the video ahead of time with the PublishQ CLI (pq media upload --file ./video.mp4 prints the media id) and put that ID in a media_id column. The Zap then runs only the create-post step.

Fields to map

Sheet columnPublishQ field
titlecontent
descriptionplatformSpecificSettings.description
publish_at (ISO, such as 2026-12-01T09:00:00Z)scheduledAt
video_url or media_idthe upload, or mediaIds[0] directly

Let an AI agent build and maintain the flow

The API, CLI and MCP server are on every plan, the Free plan included, and a coding agent can do most of the setup for you. With the PublishQ MCP server connected to Claude Code, Cursor or Codex, ask the agent to look up your YouTube account ID, write the curl commands for your two calls (n8n imports curl straight into the HTTP Request node2), and send a test video as unlisted. Later, when the flow misbehaves, the agent can list your posts with publishq_list_posts, compare what was scheduled against your sheet, and tell you which step to fix.

You may not need the flow tool at all: an agent can upload every file in a folder and schedule one a day from a single prompt.

For any other agent, open https://publishq.com/agents and paste the line at the top of that page into your agent. It sets itself up and sends you a link to approve the login in your browser.

Before you switch the flow on

Preview a title and description with the YouTube post previewer, then run the flow once with "privacyStatus": "unlisted" and open the video on YouTube. Scheduled posts stay editable until they go out, so you can still fix a wrong title or cancel one. If you upload vertical videos of 3 minutes or less, YouTube treats them as Shorts on its own, and the Shorts safe zone checker shows whether your text sits under the buttons.

scheduled youtube uploads running automatically

Create your account at publishq.com/register, connect your channel, make a key, and drop your first video in the folder.

Footnotes

  1. Quota costs for API requests - YouTube Data API (2026-11) - default allocation of 100 search.list calls, 100 videos.insert calls and 10,000 units per day for other endpoints ↩

  2. HTTP Request node - n8n Docs (2026-11) - calls any REST API, Send Body with Form-Data and the n8n Binary File parameter type, JSON body, n8n Binary File body, Import cURL ↩ ↩2 ↩3

  3. Google Drive Trigger node common issues - n8n Docs (2026-11) - polls once every minute by default, several changes in one interval arrive as items, Watch For criteria ↩

  4. Google Drive node file operations - n8n Docs (2026-11) - Download operation and the Put Output File in Field option ↩

  5. HTTP Request credentials - n8n Docs (2026-11) - header auth takes a header Name and Value ↩

  6. REST Resource: files - Google Drive API (2026-11) - size is the file's size in bytes ↩

  7. Google Drive modules - Make Apps Documentation (2026-11) - Watch Files in a Folder triggers on created or modified files, By Created Time option ↩

  8. API key authentication type - Make Apps Documentation (2026-11) - Key with a Bearer prefix, placement in the header, parameter name Authorization, allowed service origins ↩

  9. HTTP - Make Apps Documentation (2026-11) - Make a request module, multipart/form-data with File items, application/JSON with a Data structure that escapes values, Parse response ↩ ↩2 ↩3

  10. Working with files - Make Help Center (2026-11) - maximum file size per plan: Free 5 MB, Core 100 MB, Pro 250 MB, Teams 500 MB, Enterprise 1,000 MB ↩

  11. Google Sheets triggers unexpectedly or too soon - Zapier Help (2026-11) - the New Spreadsheet Row trigger can send incomplete data if the sheet autosaves while a row is being filled ↩

  12. Send webhooks in Zap workflows - Zapier Help (2026-11) - POST and PUT send files, Custom Request cannot send files and is for nested JSON arrays, Headers section, 5 MB maximum payload for actions ↩ ↩2 ↩3 ↩4

  13. Send files in Zap workflows - Zapier Help (2026-11) - file URLs must be public direct downloads, Google Drive sharing links do not work, files over 100 MB may time out ↩ ↩2

Frequently Asked Questions

Direct answers extracted from this article.

Connect your channel to PublishQ and create an API key. In n8n, Make or Zapier, start a flow from a new file in a folder or a new row in a sheet, then add two HTTP requests: POST /media to upload the video and POST /posts with the title, the media ID, your YouTube account ID and a scheduledAt time. No Google Cloud project or YouTube quota request is needed.
You do not need one. The flow works with the HTTP step every tool already has: the HTTP Request node in n8n, HTTP > Make a request in Make, and Webhooks by Zapier in Zapier. You send your PublishQ API key in an Authorization header.
POST /media takes files up to 100 MB in one request. For bigger files up to 4 GB, call POST /media/uploads, then PUT the file to the signed uploadUrl it returns. Your automation tool also has its own file size limits, so check them for your plan. Zapier caps webhook action payloads at 5 MB, so with Zapier you can upload longer videos ahead of time with the PublishQ CLI and send only the media ID.
Yes. Leave out scheduledAt and publishNow and the post waits in PublishQ as a draft. You can also schedule it with privacyStatus set to unlisted, and scheduled posts can be edited or cancelled until they go out.
Yes. With the PublishQ MCP server connected to Claude Code, Cursor or Codex, the agent can look up your YouTube account ID, write the curl commands for the upload and create-post calls, send a test video as unlisted, and later list your posts to check what the flow scheduled.
Start for Free

No credit card required • Set up in under 3 minutes