YouTube API uploads stuck private: unverified project rule

Videos uploaded through videos.insert from an unverified API project created after 28 July 2020 are locked private. Test one upload before a Sume batch.

5 min readSume
All posts

If your YouTube API uploads all land as private no matter what privacyStatus you send, check your API project first. YouTube's videos.insert page says every video uploaded through that endpoint from an unverified API project created after 28 July 2020 is restricted to private viewing mode, and lifting it requires an audit of the project.

This is a YouTube rule, not something Sume controls. Sume prepares the video file and the thumbnail; the upload is your code and your Google Cloud project. Facts below come from the videos.insert reference, the Videos resource and the quota page, all read on 2026-10-02.

What exactly does YouTube say about unverified API projects?

The reference states it plainly: videos uploaded via videos.insert from unverified API projects created after 28 July 2020 "will be restricted to private viewing mode," and the project must pass an audit to lift the restriction. The page does not describe the audit steps, so we do not either.

The status.privacyStatus field accepts private, public and unlisted. For an unverified project the documented outcome is a private video whatever you asked for, so compare what you sent with what the API reports. That is why a one-video test matters before you queue a batch.

How do I tell this apart from other reasons a Short is private?

Several things produce a private video. The table lists the ones documented on the pages above, so you can rule them out in order.

Read the uploaded video back through the API and compare status.privacyStatus with what you sent, along with status.publishAt if you scheduled it.

Why an uploaded video is private (read 2026-10-02)
CauseWhere it is documentedWhat to check
Unverified API project after 28 July 2020videos.insert referenceProject verification status in Google Cloud and YouTube
You sent privacyStatus: privateVideos resourceYour request body
Scheduled with publishAtVideos resource: only settable on a private videoYour publishAt value
Upload still processingVideos resource: uploadStatusuploaded versus processed

What should I do before a batch of Sume-made Shorts?

Do not render fifteen videos and then discover they all went private. Upload one cheap test clip first, using the same project and credentials the batch will use.

A short, silent trim is enough as a test file. Make it with video trim or any local clip, then check the result. The default quota is 100 videos.insert calls per day, so one test costs one of them.

  • Create the test upload with privacyStatus set to public on purpose.
  • Read the video back and compare the stored value with your request.
  • If it is private, fix the project verification before spending any generation credits.
  • Only then queue the Sume jobs and keep the same idempotency discipline described in Jobs and results.

Can I check the result in code?

This function takes the status part of a video you read back and tells you whether the privacy you asked for is the privacy you got. It runs as is, with a sample dict.

def privacy_gap(requested, status):
    got = status.get("privacyStatus")
    state = status.get("uploadStatus")
    if state != "processed":
        return f"not final yet: uploadStatus={state}"
    if got != requested:
        return (f"asked {requested}, got {got}: check the API "
                "project verification and any publishAt")
    return "ok"

print(privacy_gap("public", {"privacyStatus": "private", "uploadStatus": "processed"}))
print(privacy_gap("public", {"privacyStatus": "public", "uploadStatus": "processed"}))

What does a one-video test cost in Sume terms?

Nothing, if you reuse a clip. A probe-only video inspect is unbilled, and a trim is $0.02 per job at the current public rate, to be confirmed live in GET /v1/catalog. The cost that matters is the YouTube one: a unit of your 100 daily videos.insert calls and a private video you then delete or keep.

Because the private lock is a project property, it applies to every upload from that project, so one test answers the question for the whole batch.

What does Sume not do here?

Sume does not upload to YouTube, verify your project, or request an audit. If your plan is generate then upload, treat the upload account as a separate prerequisite and settle it first. For batch planning around the daily quota, see the 100-calls-per-day post.

Sources

Related posts

More in Developers

All Developers posts

Written by Sume