Publishing to the Marketplace
The Throttle marketplace lets any workspace discover and install your extension. Getting there requires meeting eligibility requirements, completing a listing, and passing a staff review. You control when the extension goes live after approval.
Eligibility
Your workspace must meet both of the following conditions before you can submit an extension for review:
Paid plan or partner status
Your workspace must be on an active paid Throttle plan, or have partner status granted by Throttle. Sandbox (trial) workspaces cannot submit extensions for public marketplace review. If you are on a trial and want to publish, upgrade your workspace first or apply for the partner program.
Publisher Agreement accepted
A workspace owner or admin must accept the Throttle Publisher Agreement in the dashboard under Extensions → Catalog → [your extension] → Review → Publisher Agreement. Acceptance is recorded once per workspace and covers all extensions you publish. The Submit button is disabled until acceptance is on record.
EXTENSIONS_PUBLIC_MARKETPLACE environment flag. The entire pipeline ships dark; the flag is flipped once the Publisher Agreement text is finalized. All API endpoints and review tooling are available regardless of the flag.Listing requirements
Before submitting for review you must complete your extension's public listing. The preflight check validates all of the following fields. Missing or invalid fields are returned as an array of specific errors with a 422 response.
- Public name — a human-readable display name for the marketplace listing, separate from the internal extension slug.
- Tagline — a single sentence (≤ 80 characters) that describes what the extension does.
- Category — one of the marketplace taxonomy categories (e.g.
analytics,fulfillment,finance). Displayed as a filter on the browse page. - Icon — a square PNG or SVG uploaded via the icon-upload flow. Stored as a public S3 object and referenced by its public URL.
- At least one screenshot — a minimum of one screenshot or promotional image (PNG/JPEG, 1280 × 800 recommended). Used in the detail page carousel.
- Support URL — an HTTPS URL to a support page or ticketing system.
- Privacy policy URL — an HTTPS URL to your privacy policy. Required by the Publisher Agreement.
- Terms of service URL — an HTTPS URL to your extension's terms of service.
https://. Plain HTTP URLs are not accepted.Review lifecycle
Submitting for review kicks off an automated preflight followed by a manual staff review. The full state machine is:
stateDiagram-v2 [*] --> not_submitted: Private extension with a published version not_submitted --> pending: Developer submits for review pending --> in_review: Staff claims the review in_review --> approved: Staff approves in_review --> changes_requested: Staff requests changes in_review --> rejected: Staff rejects changes_requested --> pending: Developer resubmits approved --> public: Developer clicks "Publish to marketplace"
- Submit — call
POST /api/v1/extensions/:id/reviews(or use the dashboard Review tab). Throttle runs automated preflight checks (listing completeness, eligibility, scope diff against the previous approved version) and creates a review with statuspending. A confirmation notification and email are sent to workspace members with theextensions:writescope. - In review — a Throttle staff member claims the review. The review moves to
in_review. Staff can see the automated check results and the scope delta relative to the previously approved version. - Decision — staff selects one of three outcomes:
- Approved — the extension passes review. The developer receives a notification and email and can now publish the extension.
- Changes requested — staff adds feedback in a threaded conversation. The developer receives a notification with the feedback, addresses the issues, and resubmits.
- Rejected — the extension will not be published to the public marketplace. Staff includes a reason. The developer may fix the underlying issues and submit a new version for review.
POST /api/v1/extensions/:id/reviews/:rid/comments to reply.# Submit the latest published version of your extension for review.
# Requires: an accepted Publisher Agreement + a completed Listing.
curl -X POST https://api.usethrottle.dev/api/v1/extensions/ext_xxx/reviews \
-H "Authorization: Bearer <dashboard-session>" \
-H "content-type: application/json" \
-d '{}'
# Response:
# {
# "data": {
# "id": "rev_01HZX...",
# "extensionId": "ext_xxx",
# "status": "pending",
# "versionId": "ver_xxx",
# "createdAt": "2026-06-06T10:00:00.000Z"
# }
# }What “Approved” unlocks
An approved review does not automatically make your extension public. Approval unlocks the Publish to marketplace button in the dashboard Lifecycle tab and the POST /api/v1/extensions/:id/lifecycle endpoint with lifecycle: "public". You choose when to go live.
# Once the review is approved, the developer publishes the extension.
curl -X POST https://api.usethrottle.dev/api/v1/extensions/ext_xxx/lifecycle \
-H "Authorization: Bearer <dashboard-session>" \
-H "content-type: application/json" \
-d '{ "lifecycle": "public" }'
# → { data: { id: "ext_xxx", lifecycle: "public", ... } }- Once
public, the extension appears inGET /api/v1/extensions?installable=trueand is browsable in the marketplace at/w/:ws/a/:app/marketplace. - You can revert to
privateat any time via the lifecycle endpoint. Existing installs are not affected by a lifecycle change. - Throttle retains the ability to revert a public extension to private in the event of a policy violation (takedown — Phase 2).
Future versions and re-review
After your extension is public, you can publish new versions at any time. Not all updates require a new review:
Auto-publish (no re-review)
- Bug fixes and UI changes within the same scopes and event subscriptions
- Updated
iframeUrlwithin the same domain - Scope reductions (removing scopes)
- Listing updates (tagline, screenshots, description)
Requires re-review
- New scopes added in a version
- New event subscriptions added in a version
iframeUrldomain changewebhookUrldomain change
Webhook events
The review pipeline emits four webhook events in the extension.review.* family. Subscribe to them on any workspace webhook endpoint with the extensions:read scope. See the Webhooks reference for the full payload shapes.
extension.review.submitted— fired when the developer submits a review.extension.review.approved— fired when staff approves the review.extension.review.changes_requested— fired when staff requests changes;data.feedbackcontains the message.extension.review.rejected— fired when staff rejects the review;data.feedbackcontains the reason.
Related guides
- Extensions Overview — lifecycle model, surfaces, versioning.
- Extension Versioning — create and publish versions before submitting for review.
- Extension Scopes — which scopes an extension may request.
- Webhooks — full event catalog and payload reference.