
The short answer
The Chrome Web Store publish API lets a script upload a new extension package and submit it for review, so releases run from CI instead of the dashboard. You need an OAuth client, a refresh token and your item ID. Review still happens on Google's side, so publish means submit, not instant live.
- Set up OAuth once; store the refresh token as a secret.
- Upload first, then call publish.
- Bump the manifest version every time.
- Publish submits for review; it isn't instant.
The fifth manual release is where it goes wrong. You zip the wrong folder, or forget to bump the version, and spend twenty minutes wondering why the dashboard rejects the upload. The Chrome Web Store publish API exists to stop that, as one step in our Chrome extension development guide.
What the Chrome Web Store publish API does
Google documents it on one page, and our overview of the Chrome Web Store API covers the wider picture. In short, your script can do two things to an item you already own: upload a new package, and submit it for publishing.
It won't create the listing, write your store copy, or skip review. Those stay in the dashboard. On purpose.

One-time setup
- Create a Google Cloud project and enable the Chrome Web Store API.
- Create an OAuth client and consent screen.
- Run the OAuth flow once to get a refresh token.
- Copy your extension's item ID from the dashboard.
- Save the client ID, client secret and refresh token as CI secrets.
Our Developer Tools category page keeps the same counts, each with the day we saw it.
The release, in order
| Step | Call or action | Fails when |
|---|---|---|
| Build | Zip the built folder | Zip contains a parent folder |
| Version | Bump version in manifest | Version matches the live one |
| Auth | Swap refresh token for access token | Token revoked or expired |
| Upload | Send the zip to the upload endpoint | Package errors or bad manifest |
| Publish | Call publish for the item | Listing incomplete in dashboard |
Run them strictly in that order. Check each response before the next step, because a failed upload followed by publish just resubmits the old draft.
Review is still the gate
Publishing through the API means submitting. Google's review process then runs as usual, and timing varies. See the review process for the steps.
Two habits help, and both come from watching reviews take longer on big, permission-heavy releases than on small, boring ones:
- Ship small, frequent versions so each review has less to look at.
- Add new permissions in their own release, with a clear reason in your listing.
A manual fallback
Keep the dashboard path written down somewhere your future self will find it at eleven at night, with the exact menu names and the folder you zip. When a build gets rejected you'll want to read the message, fix, and resubmit by hand without fighting CI at the same time.
If you also want to watch how rivals change after your releases, that's a different job. The publish API only sees your own items. We're biased, since Ext Watch tracks public listings day by day, but any dated record you keep will do.
Automate it once and the fifth release becomes boring. Boring is the goal.
Questions people ask
How do I publish a Chrome extension automatically?
Create an OAuth client, get a refresh token, then have CI upload the zip and call the publish endpoint for your item ID.
Does the publish API skip Chrome Web Store review?
No. It submits the new version. Google's review still decides when it goes live.
Can I publish a brand-new extension through the API?
Create the listing in the dashboard first. The API works on items that already exist.
Where these numbers come from
- developer.chrome.comChrome for Developers: Use the Chrome Web Store API
- developer.chrome.comChrome for Developers: Chrome Web Store review process
Part of our guide: Chrome Extension Development Guide for Founders: 5 Steps. More in Build and launch.

1,182 new extensions in the last 30 days in Developer Tools. See them all.
Start from a niche with proven demand instead of a blank page. Updated 3 Oct 2026 from our Chrome Web Store crawl




