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.

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.
| Cause | Where it is documented | What to check |
|---|---|---|
| Unverified API project after 28 July 2020 | videos.insert reference | Project verification status in Google Cloud and YouTube |
You sent privacyStatus: private | Videos resource | Your request body |
Scheduled with publishAt | Videos resource: only settable on a private video | Your publishAt value |
| Upload still processing | Videos resource: uploadStatus | uploaded 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
privacyStatusset topublicon 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
- Which MCP server lets Claude Code or Cursor generate video and images?
MCP servers that let Claude Code and Cursor make video and images: Sume, fal, Replicate, Runway, Higgsfield. Endpoints, sign-in, billing, setup.
- Idempotency keys for AI video APIs: retry without paying twice
An idempotency key makes a retried create return the original run or job instead of a second paid one. How Sume's Idempotency-Key works on each API.
- Signed webhooks for Sume video runs: events, retries, verification
Sume sends one HMAC-SHA256 signed POST when a Format, Action, or Agent Completion run completes or fails. Verify the raw body and dedupe on request_id.
- Spend caps for unattended AI agents: how Sume bounds each run
An unattended agent has no one to approve spend, so Sume caps generation per run: required on Agent Completions, and up to $500 on Format runs.
Written by Sume