---
title: "/channels"
method: GET
path: "/projects/{project_id}/channels"
tags: ["Channels"]
---

# /channels

`GET /projects/{project_id}/channels`

## Request

- Base URL: `https://api.productbyte.com/v1`
- URL: `https://api.productbyte.com/v1/projects/{project_id}/channels`
- Auth: HTTP bearer

Lists the social accounts and ad accounts connected to a project, grouped by provider. Channel ids from this endpoint are what you pass when creating a post.

### What each channel accepts

| Channel | Stills | Video | Comments | Can be taken down |
| --- | --- | --- | --- | --- |
| Instagram | 1:1, 4:5, 16:9 | 9:16 only — a feed video publishes as a Reel | yes | no — remove it in Instagram |
| Facebook Page | 1:1, 4:5, 16:9 | 1:1, 4:5, 9:16, 16:9 | yes | yes |
| TikTok | 9:16 | 9:16 | no | no — remove it in TikTok |
| X | 1:1, 4:5 | 1:1, 4:5, 9:16, 16:9 | yes | yes |
| Threads | 1:1, 4:5, 9:16, 16:9 | 1:1, 4:5, 9:16, 16:9 | yes | yes |
| Bluesky | 1:1, 4:5, 9:16, 16:9 | 1:1, 4:5, 9:16, 16:9 | yes | yes |
| Pinterest | 1:1, 4:5 — up to 5 as a carousel | 1:1, 4:5, 9:16 — one per Pin | no | yes |

A format outside the accepted ratios is refused when the post is created, not when it publishes, so a bad plan fails immediately rather than a month later. `auto_delete_after_seconds` and `POST /posts/{post_id}/retract` both need a channel in the last column.

Paginate with `cursor`: pass the `next_cursor` from the previous page. It is absent on the last page.

Requires the `channels:read` scope.

## Path parameters

- `project_id` string, required: The project to list channels for.

## Query parameters

- `limit` integer: Page size, 1–100.
- `cursor` string: A `next_cursor` from a previous page.

## Response `200`

A page of channels.

- object
  - `channels` object[], required: Channels connected to this project.
    - `id` string, required: Stable identifier for this channel. Pass it when creating a post.
    - `type` 'x_profile' | 'tiktok_creator' | 'facebook_page' | 'instagram' | 'threads_profile' | 'bluesky_profile' | 'pinterest_profile', required: What kind of destination this is.
    - `platform` 'x' | 'tiktok' | 'meta' | 'threads' | 'bluesky' | 'pinterest', required: The provider behind the channel.
    - `name` string, required: Display name, as shown in ProductByte.
    - `secondary_name` string: Owning account or business, when the provider reports one.
    - `handle` string: Public handle, without the leading @, when the provider has one.
  - `next_cursor` string: Pass as `cursor` to fetch the next page. Absent when there are no more.

## Other responses

- `401`: Missing, unknown, revoked, or expired key (`API_KEY_UNAUTHORIZED`).
- `403`: The key lacks `channels:read` (`API_KEY_SCOPE_FORBIDDEN`), or the project is outside its allowlist (`API_KEY_PROJECT_FORBIDDEN`).
- `404`: No such project in this workspace (`API_PROJECT_NOT_FOUND`).
- `429`: Too many requests for this key (`API_RATE_LIMITED`). Back off and retry; `Retry-After` gives the window length.

---

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