{"auth":{"get_a_key":"Dashboard -> the channel's API keys button -> Create key. The key is shown once.","headers":{"authorization":"Authorization: Bearer sxs_...","x_api_key":"X-API-Key: sxs_..."},"notes":["A key can only publish to the one channel it was created for.","Only a hash of the key is stored. Revoke a key from the dashboard at any time.","Revoking a key also cancels the videos it sent that haven't started posting yet (their status becomes 'failed').","Missing, unknown or revoked keys (or a disconnected channel) return 401 invalid_api_key."],"type":"Per-channel API key (starts with sxs_)."},"base_url":"https://studio.startx6.com","endpoints":[{"description":"Check a key and see which channel it publishes to.","method":"GET","path":"/api/v1/account"},{"content_types":["application/json (recommended)","multipart/form-data (direct file upload)"],"fields":{"category_id":"Optional YouTube category number, default 22.","description":"Optional (alias: caption). At most 5000 characters and 5000 UTF-8 bytes; < > become \u2039 \u203a.","external_id":"Optional id from your system (up to 128 characters). Re-sending it for the same channel returns the existing job (HTTP 200, \"duplicate\": true), even when that job failed.","made_for_kids":"Optional boolean, default false.","privacy":"Optional: public (default), unlisted or private.","scheduled_at":"Optional ISO-8601 date-time; no offset = UTC; missing or past = now; at most 180 days ahead.","tags":"Optional list of strings.","thumbnail_url":"Optional http(s) image (JPEG, PNG, WebP, GIF or BMP, up to 10 MB), resized to fit 1280x1280 under 2 MB. Multipart may send file field 'thumbnail' instead.","title":"Required, 1-100 characters. < and > are removed.","video_url":"Direct http(s) link to the video file (MP4, MOV, M4V or WebM) on port 80/443. Required unless you upload the file as multipart field 'video'."},"method":"POST","path":"/api/v1/publish","responses":{"200":"Duplicate external_id: the existing job, with \"duplicate\": true.","201":"Multipart mode: file received and validated. job.status is 'queued'.","202":"URL mode: accepted. job.status is 'downloading'; poll status_url."}},{"description":"Status of a job. Poll every 10-30 seconds until 'published' or 'failed'.","job_fields":["id","status","platform","title","scheduled_at","created_at","finished_at","post_url","post_id","error","external_id","warnings"],"method":"GET","path":"/api/v1/publish/{job_id}"}],"errors":{"400":"Validation error (missing_title, missing_video_url, invalid_url, invalid_scheduled_at, invalid_description, invalid_video, invalid_json).","401":"invalid_api_key","404":"not_found","405":"method_not_allowed","413":"too_large","429":"too_many_pending or rate_limited","500":"internal_error: retry later.","shape":{"error":"snake_case_code","message":"Human-readable explanation","ok":false}},"job_statuses":{"downloading":"We are fetching your video (and thumbnail).","failed":"Did not publish. See error; fix the cause and submit again with a new external_id.","published":"Live. post_url and post_id are filled in.","queued":"Ready; waiting for its scheduled time or the channel's daily cap.","running":"Uploading to YouTube now."},"limits":{"download_timeout_seconds":600,"json_body_max_mb":10,"max_pending_jobs_per_channel":25,"max_redirects_followed":3,"multipart_max_mb":100,"notes":["Private and local network addresses are refused.","Received video files are deleted shortly after the job finishes.","When YouTube's per-channel upload limit is hit, the job fails with an error containing \"upload limit\"; send it again later with a new external_id."],"video_max_mb":300},"name":"StartX6 Studio Publishing API","purpose":"Publish a finished video from your own app to ONE of your connected YouTube channels. We download the video, then upload it to that channel.","version":"v1"}
