# Microsoft Edge Add-ons

> Partner Center credentials and the v1.1 submission flow.

Canonical: https://docs.extension.dev/publish/edge
This page as Markdown: https://docs.extension.dev/publish/edge.md
Section: Publish to stores
Siblings: [Publishing](https://docs.extension.dev/publish/overview.md) · [Chrome Web Store](https://docs.extension.dev/publish/chrome.md) · [Firefox Add-ons](https://docs.extension.dev/publish/firefox.md) · [Executables](https://docs.extension.dev/publish/executables.md)
Map of every page: https://docs.extension.dev/llms.txt · Whole corpus: https://docs.extension.dev/llms-full.txt

---

# Microsoft Edge Add-ons

Edge submissions go through the Partner Center API v1.1. Reach for this page
when you set up the Edge credentials or decide whether a submission stops at
the draft or goes to Microsoft review.

## Quick start

```bash
curl -s -X POST https://www.extension.dev/api/cli/stores/submit \
  -H "Authorization: Bearer $EXTENSION_DEV_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"browsers":["edge"],"buildSha":"<sha>","channel":"stable"}'
```

The platform uploads the Edge build artifact, `edge.zip`, with the project's
stored credentials and records the outcome under **Submissions**. The same
submission starts from the console's **Submissions** tab or from an agent
with `extension_submit`.


## How it works

### Credentials

Requests authenticate with two headers, `Authorization: ApiKey` and
`X-ClientID`. Both values come from the Partner Center API settings. Add them
in the console under **Project settings, Store publishing, Microsoft Edge
Add-ons**, with the product ID of the listing.

### The flow

The platform uploads a draft package, polls the upload operation until it
leaves `InProgress`, then submits the draft for review. Edge tracks the
submission by the operation id the upload returns, never by a version id.

### Upload without publishing

Draft-only safe mode uploads the package to the Edge draft and leaves it
there. No review submission happens. It is a per-store setting: turn off
**Submit draft after upload** in the Edge panel under **Project settings,
Store publishing**, which stores `publishAfter: false`.

Agent and API submissions default to the draft. `extension_submit` defaults
to a dry run. A submission with `dryRun: false` through the MCP, the CLI or
an API token stops at the Edge draft unless the store settings state a mode.

An explicit `publishAfter: true` goes to Microsoft review and an explicit
`publishAfter: false` stays a draft, whoever saved it. Console submissions
follow the store setting: review unless **Submit draft after upload** is off.

### Certification notes

Edge certification notes are read from `STORE.md` in the project root and
submitted automatically. See [Publishing](/publish/overview).

### Watching

The **Submissions** tab follows the submission to a terminal state, and
`GET /api/projects/{id}/stores/status` returns the same. The states are the
eight on [Publishing](/publish/overview#watching). An upload that is not
published for review records `draft`, not `submitted`.

## Reference

### Secrets

| Value | Secret | Notes |
| --- | --- | --- |
| Client ID | `STORE_EDGE_CLIENT_ID` | Partner Center API settings, sent as `X-ClientID` |
| API key | `STORE_EDGE_CLIENT_SECRET` | Partner Center API settings, sent as `ApiKey` |

### Store settings

| Setting | Stored as | Effect |
| --- | --- | --- |
| Product ID | `storeId` | The product under `/v1/products/{productId}` |
| Submit draft after upload | `publishAfter` | `true` submits the draft for review, `false` leaves it as a draft |

### Store calls

| Step | Call |
| --- | --- |
| Upload | `POST /v1/products/{productId}/submissions/draft/package`, operation id in `Location` |
| Poll | `GET /v1/products/{productId}/submissions/draft/package/operations/{operationId}` |
| Submit | `POST /v1/products/{productId}/submissions` |

## When it fails

- **The upload operation failed.** The upload is asynchronous. A failed
  operation reports its errors when polled, and the submit step never ran.
- **Authentication fails.** That is the header pair, not the package. Confirm
  the client ID and API key both come from the same Partner Center account.
- **A store is blocked.** The preflight, `dryRun` on the submit call, reports
  credential health per store and the console page that fixes a blocked one.
- **A submission sits in `pending`.** It is still on Microsoft's side. Give
  it time before assuming failure.

## Next

- [Publishing](/publish/overview) for the three doors, dry runs and `STORE.md`
- [HTTP API](/automate/api) for the submit and status endpoints
- [Action Locales template](https://templates.extension.dev/action-locales)
  to localize the popup text with the browser language
