Table of Contents
- Why the flow calls PublishQ instead of YouTube
- The PublishQ calls every recipe uses
- n8n: Drive folder to YouTube
- Trigger
- HTTP requests
- Fields to map
- Make: Drive folder to YouTube
- Trigger
- HTTP requests
- Fields to map
- Zapier: sheet row to YouTube
- Trigger
- HTTP requests
- Fields to map
- Let an AI agent build and maintain the flow
- Before you switch the flow on
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.

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.
| Step | Request | What you send |
|---|---|---|
| Once, by hand | GET /accounts?platform=YOUTUBE | Nothing. Copy the id of your channel from accounts. |
| Upload (up to 100 MB) | POST /media | The file as multipart/form-data, field name file |
| Upload (up to 4 GB) | POST /media/uploads, then PUT to uploadUrl | filename, contentType, fileSize in bytes, then the raw file |
| Publish | POST /posts | Title, 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 Namefileand 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 field | Map from |
|---|---|
mediaIds[0] | id from the /media (or /media/uploads) response |
content | Drive file name without the extension, or a sheet column |
accountId | Your YouTube account ID, pasted once |
scheduledAt | A date column, or an expression such as tomorrow at 09:00 UTC |

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 namedfilemapped to the downloaded file9. Set Parse response to Yes so theidis 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 thefilekey. 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 column | PublishQ field |
|---|---|
title | content |
description | platformSpecificSettings.description |
publish_at (ISO, such as 2026-12-01T09:00:00Z) | scheduledAt |
video_url or media_id | the 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.
| Agent | YouTube setup guide |
|---|---|
| Claude Code | publishq.com/claude-code/youtube |
| Cursor | publishq.com/cursor/youtube |
| Codex | publishq.com/codex/youtube |
| Claude Cowork | publishq.com/claude-cowork/youtube |
| Gemini CLI | publishq.com/gemini-cli/youtube |
| Kiro | publishq.com/kiro/youtube |
| Manus | publishq.com/manus/youtube |
| Hermes Agent | publishq.com/hermes-agent/youtube |
| OpenClaw | publishq.com/openclaw/youtube |
| Muse | publishq.com/muse/youtube |
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.

Create your account at publishq.com/register, connect your channel, make a key, and drop your first video in the folder.
Footnotes
-
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 ↩
-
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
-
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 ↩
-
Google Drive node file operations - n8n Docs (2026-11) - Download operation and the Put Output File in Field option ↩
-
HTTP Request credentials - n8n Docs (2026-11) - header auth takes a header Name and Value ↩
-
REST Resource: files - Google Drive API (2026-11) - size is the file's size in bytes ↩
-
Google Drive modules - Make Apps Documentation (2026-11) - Watch Files in a Folder triggers on created or modified files, By Created Time option ↩
-
API key authentication type - Make Apps Documentation (2026-11) - Key with a Bearer prefix, placement in the header, parameter name Authorization, allowed service origins ↩
-
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
-
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 ↩
-
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 ↩
-
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
-
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
