---
title: "List projects"
method: GET
path: "/v1/projects"
tags: ["Projects"]
---

# List projects

`GET /v1/projects`

## Request

- Base URL: `https://api.subscriby.net`
- URL: `https://api.subscriby.net/v1/projects`
- Auth: HTTP bearer

```bash
curl https://api.subscriby.net/v1/projects \
  -H "Authorization: Bearer $SUBSCRIBY_TOKEN"
```

Every project visible to the token, newest first, paged with `page` and `per_page` (default 25). A token minted with `scope:project:<uuid>` entries lists only those projects.

## Query parameters

- `page` integer
- `per_page` integer
- `sort_by` string
- `sort_direction` 'asc' | 'desc'

## Response `200`

The page, newest first.

- object
  - `data` ProjectResource[], required: The items on this page.
    - `id` string, required: The project's id, the value every project-scoped endpoint takes in its path.
    - `team_id` string, nullable, required: The team the project belongs to.
    - `user_id` string, required: The creator who owns the project.
    - `name` string, required: The project's name, 5 to 255 characters.
    - `handle` string, nullable, required: The project's handle: lowercase letters, digits and dashes, unique across Subscriby, the last segment of the portal URL. Null until one is chosen; choosing one needs a tier with the custom-handle capability.
    - `description` string, nullable, required: What the project offers, up to 1,000 characters of HTML filtered to a safe subset; null when none.
    - `terms` string, nullable, required: The URL of the terms members are asked to accept; null when none.
    - `privacy` string, nullable, required: The URL of the privacy policy members are asked to accept; null when none.
    - `banner_url` string, nullable, required: The hosted banner artwork; null until uploaded and processed.
    - `photo_url` string, nullable, required: The hosted photo artwork; null until uploaded and processed.
    - `metrics` boolean, required: The **Enable Public Metrics** switch: whether the portal shows the project's member counts.
    - `outage_compensations` boolean, required: The **Outage Compensation** switch: when a platform refuses the project's connector for an hour or more and later answers again, every member whose paid access overlapped the gap gets the lost time added to the end of their access automatically. True on every new project.
    - `active` boolean, required: Whether the project is live. Archiving flips it to false and keeps everything; restoring flips it back.
    - `created_at` string, nullable, required: When the project was created, ISO 8601.
    - `updated_at` string, nullable, required: When the project last changed, ISO 8601.
  - `links` object, required: Links to the first, last, previous and next pages.
    - `first` string, nullable, required: The first page's URL.
    - `last` string, nullable, required: The last page's URL.
    - `prev` string, nullable, required: The previous page's URL; null on the first page.
    - `next` string, nullable, required: The next page's URL; null on the last page.
  - `meta` object, required: The paging counters for this page.
    - `current_page` integer, required: The page returned, 1-indexed.
    - `from` integer, nullable, required: The 1-indexed position of this page's first item across every page; null when the page is empty.
    - `last_page` integer, required: How many pages there are.
    - `links` object[], required: Generated paginator links.
      - `url` string, nullable, required: The page's URL; null for the ellipsis and the disabled arrows.
      - `label` string, required: The link's label: a page number, the previous or next arrow, or an ellipsis.
      - `active` boolean, required: Whether this link is the current page.
    - `path` string, nullable, required: Base path for paginator generated URLs.
    - `per_page` integer, required: Number of items shown per page.
    - `to` integer, nullable, required: Number of the last item in the slice.
    - `total` integer, required: Total number of items being paginated.

## Other responses

- `401`: `AUTHENTICATION_REQUIRED`: the request carries no bearer token, or one that is revoked, malformed, or minted for another environment (an `sbt_test_` token on production).
- `403`: `TOKEN_MISSING_ABILITY`: the token is valid but does not carry the ability this endpoint requires; `error.context.required_ability` names the one to grant. An endpoint that also checks who owns a row or which tier the account is on answers `FORBIDDEN`, `TEAM_TIER_REQUIRED` or `CONNECTOR_TIER_REQUIRED` with the same status, and says so in its own description.
- `429`: `RATE_LIMITED`: the token has spent its 300 requests a minute or 10,000 an hour; `Retry-After` says when the next one is accepted.

---

[API](https://skmtc.dev/memberpass/apis/subscriby-rest-api.md) · [All operations](https://skmtc.dev/memberpass/apis/subscriby-rest-api/llms.txt) · [OpenAPI document](https://skmtc.dev/memberpass/apis/subscriby-rest-api/revisions/59c4df91d764?raw)
