---
title: "Create a change feed"
method: POST
path: "/v1/workspaces/{workspace}/feeds"
---

# Create a change feed

`POST /v1/workspaces/{workspace}/feeds`

## Request

- Base URL: `https://api.uploads.sh`
- URL: `https://api.uploads.sh/v1/workspaces/{workspace}/feeds`
- Auth: HTTP bearer

Creates a public newest-first screenshot feed for a GitHub owner/repo, optionally scoped to one pull request or issue. The same scope returns the existing feed.

## Request body

- FeedCreate
  - `repo` string, required: GitHub owner/repo.
  - `path` string, nullable: Optional exact page-path metadata filter.
  - `number` integer, nullable: Optional pull request or issue number. Filters on gh.number.
  - `kind` 'pull' | 'issue', nullable: Display-only. Set automatically when you pass pr or issue.
  - `pr` integer, nullable: Alias for number with kind=pull. Mutually exclusive with number and issue.
  - `issue` integer, nullable: Alias for number with kind=issue. Mutually exclusive with number and pr.

## Response `200`

The existing feed for this scope.

- Feed
  - `id` string, required
  - `url` string, uri, required: Canonical public page (`/c/<id>`).
  - `workspace` string, required
  - `repo` string, required
  - `path` string, nullable
  - `number` integer, nullable
  - `kind` 'pull' | 'issue', nullable
  - `title` string, required
  - `source` 'comment' | 'user' | 'null', nullable: Who created the feed: PR comment sync or a user. Null for feeds created before this field.
  - `createdAt` string, date-time, required
  - `updatedAt` string, date-time, required
  - `items` FeedItem[], required
    - `id` string, required
    - `objectKey` string
    - `filename` string, required
    - `status` 'available' | 'missing' | 'withheld', required
    - `url` string, uri, nullable, required
    - `embedUrl` string, uri, nullable, required
    - `pageUrl` string, uri
    - `contentType` string, nullable
    - `size` integer, nullable
    - `uploaded` string, date-time, nullable
    - `modified` string, date-time, nullable
    - `path` string, nullable
    - `state` string, nullable

## Other responses

- `201`: The feed was created.
- `400`: Invalid request.
- `401`: Missing or invalid credential.
- `403`: The credential lacks the required scope or role.
- `409`: The request conflicts with current resource state.
- `429`: The workspace rate limit or upload budget was exceeded.

---

[API](https://skmtc.dev/uploads/apis/uploads-sh-api.md) · [All operations](https://skmtc.dev/uploads/apis/uploads-sh-api/llms.txt) · [OpenAPI document](https://skmtc.dev/uploads/apis/uploads-sh-api/revisions/6df242babacd?raw)
