Changelog
Changes to the Newsroom Video API that affect customers and integrations. This file is also published at /changelog.
We only add to /v1: new optional parameters, new response fields and new presets. Anything that could break an existing integration will be announced here before it happens.
1.7.0 - 2026-11-15
Nothing here changes how existing integrations behave. Everything below is new and optional.
Added
- Transcoding from a link.
POST /v1/jobsaccepts JSON{"source_url": "https://…"}instead of the file, and we download the video when the job's turn comes. Presigned links (S3, R2, Google Cloud) work, and we forget the link once the video is downloaded. Uploading the file works exactly as before. - Resumable downloads and seeking.
GET /v1/jobs/{id}/downloadaccepts aRangeheader and answers206with that part of the file, so video players can seek and download tools can resume. Downloads now carryAccept-Ranges,ETagandLast-Modified, andIf-Rangemakes resuming safe. WithoutRange, downloads are unchanged. - New error codes:
invalid_source_url(422),range_not_satisfiable(416), and the job errorsource_fetch_failed. A video atsource_urlthat is over the plan's upload limit fails withfile_too_large.
1.6.1 - 2026-11-14
Nothing here changes how integrations call the API, and no settings or presets have changed.
Changed
- Videos are now encoded with FFmpeg 7.1 (previously 5.1), with the same settings. Reels are drawn exactly as before; the encoded files differ slightly at the byte level but not visibly (we measured 47 dB PSNR against the old encoder's output), at the same loudness, and are about 3% larger.
- The monthly allowance is now enforced across jobs that run at the same time. Each job reserves its seconds when it starts, so several jobs starting together can no longer go over the allowance between them. A job that would go over still fails with
quota_exceededbefore any work is done, and isn't billed. - A render with several video formats processes its soundtrack once and shares it between the formats. The sound is unchanged.
1.6.0 - 2026-10-31
Nothing here changes how existing integrations behave. A render manifest without the new fields makes exactly the same video as before, frame for frame.
Added
- One render can now make several outputs.
outputsin thePOST /v1/rendersmanifest lists them:vertical(1080×1920, the default),landscape(1920×1080),square(1080×1080),thumbnail(a JPEG) andcaptions_srt/captions_vtt(caption files). All are made from the same script, voiceover and settings. GET /v1/jobs/{id}lists a render'soutputs, each with itsname,media_type,bytes,width,heightanddownload_url. Fetch one withGET /v1/jobs/{id}/download?output=landscape; withoutoutputyou get the main video (the first video listed), as before. Webhook events includeoutputstoo.- Each video output is billed for its length: a 22-second reel in vertical and landscape uses 44 seconds. Thumbnails and caption files are free.
loudness_lufsnormalises the voiceover to a set loudness, e.g.-14for social media. It measures the voiceover first, then applies one steady gain, so speech sounds natural.max_duration_secondsrefuses a video longer than a platform allows. The job fails withduration_too_longbefore anything is drawn, and nothing is billed.- New
image_motionvalues:zoom_in,zoom_out, andalternate, which zooms in on one story and out on the next. - New error code
output_not_found(404), for?output=naming an output the job doesn't have.
1.5.0 - 2026-10-30
Nothing here changes how existing integrations behave. Everything below is new.
Added
- Webhooks. Set an
https://address withPUT /v1/webhookand we POST ajob.completedorjob.failedevent to it as soon as a job finishes, so you don't have to keep polling. Each event is signed (Newsroom-Signatureheader, HMAC-SHA256 with your webhook secret) and retried with backoff for about two days if your server doesn't answer with a 2xx.GET /v1/webhookshows recent deliveries,POST /v1/webhook/testsends aping, andDELETE /v1/webhookturns it off. PollingGET /v1/jobs/{id}keeps working as before. - Read-only API keys, for dashboards and reports. They can look at jobs, downloads, usage and the webhook, but can't create or delete anything. Using one to create a job is refused with
insufficient_scope(403). - Key expiry and rotation. A key can be given an end date. When we replace a key, the old one keeps working for a while (normally two weeks), so you can swap the new one in without downtime. Responses carry an
api_key_expiringwarning in the last two weeks, and the account's email address gets a reminder a week before. An expired key is refused withapi_key_expired(401). GET /v1/usageincludesapi_key(itsprefix,scopeandexpires_at).- Quota emails. The account's email address is told when 80% and when 100% of the monthly allowance is used.
- A
quota_used_upwarning once the allowance is used up. Before that,quota_nearly_usedis shown from 80%, as now. - The account page shows each key's expiry date and whether it is read-only.
1.4.0 - 2026-10-28
Nothing here changes how existing integrations behave. Everything below is new.
Added
- Server-side news reels:
POST /v1/renderstakes a JSON manifest (voiceover, 1 to 5 articles with headlines and images, logo, colours, captions, sponsor, start and end screens) and makes a 1080×1920 MP4. It is an ordinary job: follow it withGET /v1/jobs/{id}and fetch it withGET /v1/jobs/{id}/download. It is billed by the length of the finished video, and takes its turn in the queue like any other job. - The frames are drawn by the same code as the Newsroom Video plugin's browser renderer, so both look the same.
- Media can be
https:URLs (public addresses only) or small inlinedata:URLs. GET /v1/jobs/{id}includesprogress(0 to 100) for renders,nullfor other jobs.GET /v1/usagelistsrenderers(currentlynews_reel, version 1). Render presets are not listed inpresets, and can't be used withPOST /v1/jobs.- A failed render can be sent again with the same
Idempotency-Key. Reusing a key for different content is refused withidempotency_key_reused. - New error codes:
invalid_manifest(422, themessagesays which field),body_too_large(413), and job errorsmedia_fetch_failed,media_invalidandrender_failed.
1.3.0 - 2026-10-28
Nothing here changes how existing integrations call the API. Everything below is new.
Added
- Fair queueing. Newsrooms now take turns: each gets one video started per turn, so one newsroom's batch never holds up everyone else. Previously videos ran strictly in arrival order.
- Priority processing, as an annual add-on or built into a plan. Priority newsrooms' videos start first, taking turns with each other. A standard video that has waited a while is moved up alongside priority work, so it is never held back for long.
GET /v1/jobs/{id}includesqueue_position(1 means next) andestimated_start_secondswhile a job is queued, andnullotherwise. The estimate is rough: use it for messages like "2nd in queue, about a minute".- The account page shows whether your newsroom has priority processing, your videos waiting and processing now, your typical wait, and how long each recent job waited.
- The homepage shows live queue activity and daily volume.
1.2.0 - 2026-10-28
Nothing here changes how existing integrations behave. Everything below is new and optional.
Added
Idempotency-Keyheader onPOST /v1/jobs. Send a key that is unique to the video and preset, and reuse it when you retry: you get the original job back (markedIdempotent-Replayed: true) instead of a second, billed job.- Every response has an
X-Request-Idheader. You can send your own (8 to 128 letters, digits,.,_,:or-) to match your logs to ours. Quote it when contacting support. - Error responses now include
message,docs_urlandrequest_idas well asdetail. Keep usingdetailin code:messagemay be reworded. - Every
/v1JSON response includes awarningsarray, usually empty. It currently reportsquota_nearly_usedfrom 80% of the monthly allowance, and will report deprecations, withDeprecationandSunsetheaders, well before anything is retired. - Preset versions.
preset=mp4means the current default version, andpreset=mp4@1pins one. Jobs reportpreset_version, andGET /v1/usagelistspreset_versions. A preset's output only changes through a new version announced here first. - New error codes:
invalid_idempotency_key(400),idempotency_key_reused(422) andidempotency_key_in_use(409).
Changed
- Please send a
User-Agentnaming your plugin and version, e.g.NewsroomVideo-WP/2.9.0 WordPress/6.6. It lets us tell you before a change affects the version you run.
1.1.0 - 2026-10-28
Added
- This changelog, published at /changelog.
1.0.0 - 2026-10-27
Added
- Asynchronous jobs:
POST /v1/jobsto upload,GET /v1/jobs/{id}to check,GET /v1/jobs/{id}/downloadto fetch the output andDELETE /v1/jobs/{id}to remove files early. - Presets:
mp4,mp4_720p,vertical_1080x1920,square_1080andthumbnail_jpg. GET /v1/usagefor the current month's usage and plan limits.- Trial, Starter and Pro plans with a monthly video allowance.
- Location and device metadata are removed from every output.
- Public pages: home, the user guide and the account dashboard.