---
title: "List public publish enablement requests"
method: GET
path: "/projects/public-publishing-requests"
tags: ["Approval requests"]
---

# List public publish enablement requests

`GET /projects/public-publishing-requests`

## Request

- Base URL: `https://api.replit.com/v1`
- URL: `https://api.replit.com/v1/projects/public-publishing-requests`
- Auth: HTTP bearer

Returns public publish enablement requests owned by the authenticated
Account. Without a status filter, only pending requests are returned. Use a
comma-separated status list to include other lifecycle states.

Results are ordered by creation time, newest first. Cursors are bound to
the Account and the effective status, workspaceId, projectId, and limit
settings. Reusing a cursor with different effective filters or a different
limit returns `invalid_request`. Explicit default values and reordered or
repeated statuses do not change these settings.

Requests remain accessible to the Account that received them after a Project
moves. A Project outside that Account has a null workspaceId; destination
details are not returned.
Account and Project-filtered lists include these retained requests. Workspace
filters select only Projects currently in that Account's Workspace.

Every item includes an opaque `reviewEtag`. Copy the complete quoted value
unchanged into `If-Match` on the matching review
route; do not parse it or use the collection HTTP ETag. This enables review
without a detail GET. A detail GET remains optional when event history or
the detail ETag is needed.

Requesters are represented by `requesterUserId`, not a user profile. List
entries do not include event history; use the detail operation to retrieve it.

## Query parameters

- `status` PublicPublishEnablementRequestStatus[]
- `workspaceId` string
- `projectId` string, uuid
- `limit` integer
- `cursor` string

## Response `200`

Public publish enablement request list.

- PublicPublishEnablementRequestListResponse
  - `data` PublicPublishEnablementRequestListItem[], required
    - `id` string, uuid, required
    - `status` 'pending' | 'approved' | 'fulfillment_started' | 'fulfilled' | 'fulfillment_failed' | 'denied' | 'canceled', required
    - `workspaceId` string, nullable, required: Current workspace in this Account, or null when the Project no longer belongs to this Account.
    - `projectId` string, uuid, required
    - `requesterUserId` string, required
    - `version` integer, required: Increments with every recorded event. Use reviewEtag, not this field, when reviewing a listed request.
    - `createdAt` string, date-time, required
    - `updatedAt` string, date-time, required
    - `reviewEtag` string, required: Opaque review token for this request. Copy the complete value unchanged into If-Match; do not parse it or use the collection HTTP ETag.
  - `pagination` union, required
    - object
      - `cursor` string, required: Opaque cursor for the next page.
      - `hasMore` true, required
    - object
      - `cursor` unknown, required
      - `hasMore` false, required

## Other responses

- `400`: The request parameters are invalid.
- `401`: The API key is missing, malformed, unknown, revoked, or expired.
- `403`: The API key lacks the required scope or Account entitlement.
- `404`: The requested resource does not exist or is not visible to this key.
- `429`: The API key or operation exceeded its rate limit.
- `500`: The server encountered an unexpected error.
- `503`: A required API dependency is temporarily unavailable.

## Changes

- **2026-09-19** `ba193431df44`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/replit/apis/replit-api/changes/projects/public-publishing-requests/get.md)

---

[API](https://skmtc.dev/replit/apis/replit-api.md) - [All operations](https://skmtc.dev/replit/apis/replit-api/llms.txt) - [OpenAPI document](https://skmtc.dev/replit/apis/replit-api/revisions/03b316f7e71a?raw)
