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

# List publishing approval requests

`GET /projects/publishing-requests`

## Request

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

Returns publishing approval requests owned by the authenticated Account.
Each request asks to publish one Project; requests to allow public
publishing are a separate flow. 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` PublishingRequestStatus[]
- `workspaceId` string
- `projectId` string, uuid
- `limit` integer
- `cursor` string

## Response `200`

Publishing approval request list.

- PublishingRequestListResponse
  - `data` PublishingRequestListItem[], 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 token for this request. Copy the complete value unchanged; do not construct or parse it.
  - `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-30** `6586aa4ce5a3`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/replit/apis/replit-api/changes/projects/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)
