Хочеш, щоб готові відео самі з'являлися на твоєму YouTube-каналі, без ручного завантаження через YouTube Studio? Для цього є YouTube Data API. Технічно завантажити відео нескладно, але по дорозі є кілька пасток. Через одну з них усі відео тихо стають приватними, через іншу доступ «відвалюється» рівно через тиждень. У цій інструкції я покроково пройду весь шлях: від порожнього проєкту в Google Cloud до форми аудиту, після якого відео публікуються відкрито 🎬

Інструкція універсальна: байдуже, чим ти публікуєш – PHP-скриптом, Python, Node.js чи будь-якою CMS. Від тебе потрібні лише Google-акаунт із YouTube-каналом і сервер, який уміє робити HTTPS-запити.

Як це працює

Спершу про загальну схему, щоб далі було зрозуміло, навіщо кожен крок:

  1. У Google Cloud ти створюєш проєкт, вмикаєш у ньому YouTube Data API і налаштовуєш OAuth-застосунок.
  2. Один раз входиш у Google-акаунт власника каналу і дозволяєш цьому застосунку завантажувати відео. Натомість отримуєш refresh token – довготривалий ключ.
  3. Твій скрипт щоразу обмінює refresh token на короткий access token (діє близько години) і завантажує відео методом videos.insert.
  4. Поки проєкт не пройшов аудит, YouTube робить усі такі відео приватними. Після аудиту вони публікуються так, як ти вказав/ла.

Дві пастки, про які варто знати з самого початку:

  • Статус «Testing». Поки застосунок у режимі тестування, refresh token живе лише 7 днів. Рівно через тиждень автопостинг перестає працювати з помилкою invalid_grant. Лікується перемиканням у «In production» (крок 3).
  • Приватні відео. Усе, що завантажує неперевірений проєкт автоматично стає приватним. Лікується аудитом (кроки 7–8).

Крок 1. Створи проєкт у Google Cloud

Відкрий console.cloud.google.com під тим Google-акаунтом, яким будеш керувати застосунком. Він не обов'язково має збігатися з акаунтом каналу. Створи новий проєкт: назва будь-яка, наприклад youtube-autopost, організацію для особистого акаунта можна не вказувати.

Створення нового проєкту в Google Cloud Console

Крок 2. Увімкни YouTube Data API v3

У меню APIs & Services → Library знайди YouTube Data API v3 і натисни Enable. Після цього на сторінці API з'явиться позначка API Enabled.

YouTube Data API v3 увімкнено в проєкті

Крок 3. Налаштуй OAuth-застосунок (Google Auth Platform)

Далі відкрий розділ Google Auth Platform (раніше він називався OAuth consent screen). Тут чотири підрозділи, які нас цікавлять.

Branding

Вкажи назву застосунку та email для підтримки. Дві поради:

  • Не використовуй слово YouTube у назві. Правила YouTube API це забороняє без окремого письмового дозволу, і форма аудиту прямо про це питає.
  • Не завантажуй логотип. Із логотипом Google вимагає окремо верифікувати брендинг. Для автопостингу у власний канал це зайвий клопіт.

Розділ Branding: назва застосунку та email підтримки

Audience

Тип користувачів – External (для звичайного Google-акаунта інших варіантів і немає). Після першого налаштування застосунок має статус Testing. Додай свій акаунт у Test users, а коли все запрацює, натисни Publish app, щоб статус став In production. Саме це прибирає 7-денне обмеження на refresh token.

Не лякайся повідомлення, що застосунок «requires verification». Повноцінна верифікація потрібна, коли застосунком користуються сторонні люди. Для одного власного акаунта (ліміт – 100 користувачів) достатньо один раз пройти попередження «Google hasn't verified this app» під час входу.

Розділ Audience: статус In production і тип External

Data Access

Натисни Add or remove scopes і додай лише один дозвіл:

https://www.googleapis.com/auth/youtube.upload

Він дозволяє тільки завантажувати відео і не дає доступу до решти даних каналу. Google позначає його як «sensitive». Для власного використання це нормально, поле з обґрунтуванням можна не заповнювати.

Розділ Data Access: доданий scope youtube.upload

Крок 4. Створи OAuth-клієнт

У підрозділі Clients натисни Create client. Тип застосунку – Web application, назва будь-яка.

Створення OAuth-клієнта типу Web application

У блоці Authorized redirect URIs додай адресу OAuth Playground: через нього ми отримаємо refresh token без написання жодного коду.

https://developers.google.com/oauthplayground

Redirect URI для OAuth Playground

Після збереження Google покаже Client ID і Client secret. Збережи обидва. Secret – це пароль твого застосунку: не публікуй його і не кидай у публічний репозиторій.

Крок 5. Отримай refresh token через OAuth Playground

  1. Відкрий OAuth 2.0 Playground.
  2. Натисни шестерню праворуч угорі, постав галочку Use your own OAuth credentials і встав свої Client ID та Client secret. Access type має бути Offline – так і є за замовчуванням.
  3. Зліва внизу, в полі Input your own scopes, введи https://www.googleapis.com/auth/youtube.upload і натисни Authorize APIs.
  4. Увійди в Google-акаунт, до якого прив'язаний канал. Якщо в тебе кілька каналів або бренд-канал, обери саме його у вікні вибору каналу.
  5. З'явиться попередження «Google hasn't verified this app». Натисни Advanced → Go to …(unsafe): це твій власний застосунок. Далі дозволь керувати відео на YouTube.
  6. Повернувшись у Playground, натисни Exchange authorization code for tokens і скопіюй Refresh token.

OAuth Playground: власні credentials і scope youtube.upload

Client ID, Client secret і refresh token – це все, що потрібно твоєму скрипту. Зберігай їх лише на сервері.

Крок 6. Завантаж відео з коду

Незалежно від мови програмування, послідовність одна й та сама. Для наочності покажу її на curl.

1. Отримай access token:

curl -s https://oauth2.googleapis.com/token \
  -d client_id=CLIENT_ID \
  -d client_secret=CLIENT_SECRET \
  -d refresh_token=REFRESH_TOKEN \
  -d grant_type=refresh_token

У відповіді буде поле access_token. Воно діє приблизно годину, тож отримуй новий перед кожним завантаженням.

2. Почни resumable-завантаження і передай метадані відео:

curl -i -X POST "https://www.googleapis.com/upload/youtube/v3/videos?uploadType=resumable&part=snippet,status" \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  -H "Content-Type: application/json; charset=UTF-8" \
  -H "X-Upload-Content-Type: video/mp4" \
  -H "X-Upload-Content-Length: $(stat -c%s video.mp4)" \
  -d '{
    "snippet": {"title": "Назва відео", "description": "Опис і посилання", "categoryId": "28"},
    "status": {"privacyStatus": "public", "selfDeclaredMadeForKids": false}
  }'

У заголовку відповіді Location буде адреса для завантаження самого файлу (на macOS замість stat -c%s використовуй stat -f%z).

3. Завантаж файл на цю адресу (підстав її замість UPLOAD_URL):

curl -X PUT "UPLOAD_URL" \
  -H "Content-Type: video/mp4" \
  --data-binary @video.mp4

Кілька практичних нюансів:

  • Shorts. Окремого «ендпоінта для Shorts» немає. YouTube сам зараховує в Shorts вертикальне або квадратне відео тривалістю до 3 хвилин. Хештег #Shorts в описі не обов'язковий.
  • Посилання в описах і коментарях до Shorts не клікабельні, тож не розраховуй на них як на джерело трафіку.
  • Назва – до 100 символів, опис – до 5000. Символи < і > у них заборонені.
  • categoryId – числовий ID категорії: наприклад, 22 – People & Blogs, 27 – Education, 28 – Science & Technology.

Квоти: скільки відео можна завантажити

Для завантажень у YouTube Data API є окремий ліміт: 100 викликів videos.insert на добу. Решта методів ділять між собою загальну квоту в 10 000 одиниць на добу. Для автопостингу навіть кількох відео на день цього з великим запасом вистачає, тож просити додаткову квоту не потрібно.

Чому відео приватні і що з цим робити

Якщо ти вже спробував/ла завантажити відео, то, найімовірніше, побачив його в YouTube Studio зі статусом «Приватне», хоча в запиті було "privacyStatus": "public". Це не помилка: так працюють усі неперевірені проєкти. Зняти обмеження можна лише одним способом – пройти аудит YouTube API Services. Він безкоштовний, але вимагає трохи підготовки.

Крок 7. Підготуй сайт до аудиту

Рецензенти перевіряють не код, а те, чи дотримується твій сайт правил YouTube API. Мінімум, який варто мати до подачі форми:

  • Політика конфіденційності з окремим розділом про YouTube API Services. У ньому має бути: що саме робить сайт через API (у нашому випадку – лише завантажує відео у власний канал), що дані відвідувачів через API не збираються, які облікові дані зберігаються і де, посилання на Умови використання YouTube та Політику конфіденційності Google, а також як відкликати доступ (security.google.com/settings/security/permissions). Рецензенти не завжди читають українською, тож варто додати коротку англійську версію.
  • Умови використання з рядком про те, що, переглядаючи відео на YouTube, користувач погоджується з Умовами використання YouTube.
  • Посилання на політику в підвалі кожної сторінки, зокрема головної.

Ось як такий розділ виглядає в моїй політиці конфіденційності:

Розділ про YouTube API Services у політиці конфіденційності

Одразу підготуй скріншоти для форми. Вимоги в неї такі: роздільна здатність від 1280×720, чіткий текст, обов'язково видимий адресний рядок браузера і зрозумілі назви файлів (наприклад, privacy-policy-page.png). У кожне поле форми можна завантажити лише один файл до 10 МБ (JPEG, PNG або PDF). Тому, якщо доказів кілька, збери їх в один PDF.

Що знадобиться:

  1. Політика конфіденційності з розділом про YouTube.
  2. Головна сторінка з видимим посиланням на політику.
  3. Умови використання.
  4. Інтерфейс, звідки відбувається завантаження: сторінка налаштувань твого скрипта (з прихованими ключами), приклад відео перед публікацією.
  5. Скріншоти OAuth: екран згоди з дозволом на керування відео та сторінка, де доступ можна відкликати.
  6. Необов'язково, але бажано: схема архітектури й схема сценарію використання – по одній сторінці, англійською.

Крок 8. Заповни форму аудиту

Форма знаходиться тут: YouTube API Services – Audit and Quota Extension Form. Вона довга, але для автопостингу у власний канал більшість відповідей очевидні. Розділи розгортаються галочками біля заголовків.

Розділ 1. Причина звернення

Обирай Complete a compliance audit to request for additional quota. Окремого пункту «зняти обмеження на приватні відео» немає – його знімає саме аудит.

Розділ 1 форми аудиту: причина звернення

Розділ 2. Хто подає заявку

Якщо в тебе немає компанії: As an individual user, у полях назви організації та материнської компанії пиши self, як радить сама форма. Далі – адреса сайту (обов'язково з https://), твоя адреса й контакти.

Розділ 2: подача заявки як фізична особа

Категорія – Creator Tools and Services, розмір – Independent Developer/Sole Proprietor. Для технічного й бізнес-контакту можна поставити галочку Same as Primary Contact.

Категорія і тип організації

Розділ 3. Бізнес-модель

Коротко і чесно опиши, що робить твій скрипт (мінімум 100 символів). Наприклад:

Personal blog. A server-side script on my own website uploads ready-made videos to my own YouTube channel via videos.insert. Only my own channel is used; there are no third-party users.

Аудиторія – Internal Users, монетизація – Free service, представника Google – No. Поля Content Owner ID та Google Ads ID залиш порожніми.

Розділ 3: опис роботи з YouTube і цільова аудиторія

Розділ 4. API-клієнт

Назва клієнта – без слова YouTube. Primary Access URL – адреса сайту, далі посилання на політику конфіденційності й умови використання. На питання Is your API Client publicly accessible? відповідай No: це внутрішній інструмент, яким користуєшся лише ти.

Розділ 4: назва клієнта та адреси сайту

Поля демо-акаунта можна залишити порожніми, а в Special Instructions написати, що це внутрішній інструмент власника сайту і весь процес показано на скріншотах. Давати стороннім доступ до своєї адмінки не варто.

Розділ 5. Проєкт і сценарії використання

  • Google Cloud Project Number – саме номер (лише цифри), а не ID проєкту. Його видно на головній сторінці проєкту в Cloud Console, у картці Project info.
  • Use Case Category – Video Uploading & Account Management та Internal Company Tool.
  • OAuth – Yes.
  • Галочки про derived metrics і зберігання даних обов'язкові – постав їх.
  • Expected API Usage Volume – Fewer than 1,000 requests per day.

Розділ 5: сценарії використання API

У переліку ендпоінтів познач лише youtube.videos.insert. Загальна квота – No change / Default quota. Для videos.insert форма окремо попросить денну кількість і обґрунтування: вкажи реальну потребу, наприклад 5 і «one upload per new blog article, usually 1 per day».

Квота і вимоги до скріншотів

Розділ 6. Додаткові матеріали

Тут три необов'язкові поля: схема архітектури, схема сценарію використання та інші матеріали. Якщо є час – додай. Проста схема «сайт → сервер → Google OAuth → YouTube Data API → твій канал» з приміткою, що сторонніх користувачів і їхніх даних немає, знімає більшість питань рецензента.

Розділ 7. Підтвердження

Усі галочки обов'язкові: згода з умовами YouTube API Services, політикою конфіденційності Google і правилами для розробників, розуміння, що доступ можуть відкликати, підтвердження правдивості даних і згода на обробку заявки. Після цього – Submit.

Розділ 7: обов'язкові підтвердження

Розгляд зазвичай триває від кількох днів до кількох тижнів. Відповідь прийде на вказаний email. Найчастіше рецензенти просять уточнити політику конфіденційності або надіслати додаткові скріншоти – просто відповідай на лист.

Типові помилки

Помилка Причина Що робити
invalid_grant під час оновлення токена Застосунок у статусі Testing (токен живе 7 днів), доступ відкликано або refresh token не використовувався 6 місяців Перевести застосунок у In production і отримати новий refresh token
redirect_uri_mismatch У клієнті не додано адресу OAuth Playground Додати https://developers.google.com/oauthplayground в Authorized redirect URIs
youtubeSignupRequired В акаунта, яким ти авторизувався/лася, немає YouTube-каналу Авторизуватися акаунтом (або бренд-каналом), куди мають потрапляти відео
uploadLimitExceeded / quotaExceeded Вичерпано денний ліміт завантажень або квоту Зачекати до скидання квоти (опівночі за тихоокеанським часом)
Відео завантажилося, але приватне Проєкт ще не пройшов аудит Подати форму аудиту (крок 8)

Коротко: чекліст

  1. Проєкт у Google Cloud, увімкнено YouTube Data API v3.
  2. Google Auth Platform: назва без «YouTube», без логотипа, тип External, статус In production, scope youtube.upload.
  3. OAuth-клієнт Web application з redirect URI OAuth Playground.
  4. Refresh token отримано акаунтом власника каналу.
  5. Скрипт оновлює access token і завантажує відео через resumable upload.
  6. На сайті є політика конфіденційності з розділом про YouTube API і умови використання.
  7. Форму аудиту подано, скріншоти – з адресним рядком.

Після схвалення аудиту відео почнуть публікуватися з тим статусом, який ти вказуєш у запиті.

Що далі

YouTube – не єдине місце, куди можна публікувати автоматично. Найпростіше почати з Telegram: ось автопостинг у Telegram через API за допомогою PHP. Схожий шлях з токенами доступу є і в Meta – читай автопостинг у Facebook з PHP. А якщо відео для каналу ти записуєш з екрана, глянь найкращі програми для запису екрана в Linux.

Більше про це – за позначками YouTube та REST API.

А ти вже публікуєш відео автоматично чи поки завантажуєш руками через YouTube Studio? Якщо щось не виходить – пиши в коментарях, розберемося разом 🙂