---
title: "Get a publishing approval request"
method: GET
path: "/projects/publishing-requests/{requestId}"
tags: ["Approval requests"]
---

# Get a publishing approval request

`GET /projects/publishing-requests/{requestId}`

## Request

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

Returns one request with its ordered public event history. The requester
is represented by `requesterUserId`, not a user profile.

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.

After approval, `execution` describes the resulting publish:
`execution.operationId` identifies it once publishing starts, and
`execution.message` explains a failed publish and what to do next.

The response includes a strong opaque `ETag`. Send the complete value
unchanged in `If-None-Match` on a later detail read. A matching value returns
304 with no body; otherwise the response is 200 with the request details.
Use the same tag in `If-Match` when reviewing the request.

The tag changes when the request's event history or visible Workspace
changes, but not for every change to the response's other fields. Omit
`If-None-Match` when you need the latest complete response.

## Path parameters

- `requestId` string, uuid, required

## Headers

- `If-None-Match` string

## Response `200`

Publishing approval request with event history.

- PublishingRequestResponse
  - `data` PublishingRequestWithEvents, 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 the ETag header, not this field, for conditional requests. A change to the visible Workspace can change the ETag without a new event.
    - `createdAt` string, date-time, required
    - `updatedAt` string, date-time, required
    - `events` PublishingRequestEvent[], required
      - `sequence` integer, required
      - `eventType` 'request_started' | 'request_approved' | 'request_denied' | 'request_canceled' | 'request_fulfillment_started' | 'request_fulfilled' | 'request_fulfillment_failed', required
      - `fromStatus` 'pending' | 'approved' | 'fulfillment_started' | 'fulfilled' | 'fulfillment_failed' | 'denied' | 'canceled', required
      - `toStatus` 'pending' | 'approved' | 'fulfillment_started' | 'fulfilled' | 'fulfillment_failed' | 'denied' | 'canceled', required
      - `actor` union, required
        - object
          - `type` 'user', required
          - `userId` string, required
        - object
          - `type` 'api_key', required
          - `apiKeyId` string, uuid, required
        - object
          - `type` 'system', required
          - `systemId` string, required
      - `publicNote` string, nullable, required
      - `occurredAt` string, date-time, required
    - `execution` object, required: The publish started by approval.
      - `operationId` string, uuid, nullable, required: Identifier of the publish started by approval, or null until publishing starts.
      - `message` string, nullable, required: Explanation and next steps when publishing fails; otherwise null.

## Other responses

- `304`: The conditional request matched the current ETag. The body is empty. Other response fields can change without changing the tag; omit If-None-Match to retrieve the latest complete response.
- `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/:requestId/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)
