Skip to content
Developers
Open app

List collections

GET
/v1/collections
const url = 'https://api.focal.inc/v1/collections?space_id=6916bc3d-e1ab-425b-ac25-eefada01a9a2';
const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try {
const response = await fetch(url, options);
const data = await response.json();
console.log(data);
} catch (error) {
console.error(error);
}

List a space’s collections — the curated, shareable sets of media the Focal web app calls Collections. Newest first.

Pass search to match collection names (case-insensitive substring).

media_ids is selectable but off by default: a large collection carries thousands of ids, and media_count is usually the answer.

Pass fields to trim the response to the properties you actually need — e.g. ?fields=name,html_url returns just those (plus id, always). Unknown names are rejected rather than ignored.

Required scope: collections:read. Rate-limit cost: 5.

space_id
required
string format: uuid

Example

6916bc3d-e1ab-425b-ac25-eefada01a9a2

Required. The single space to query, as a UUID. The API reads one space at a time — comma-separated lists and wildcards are not accepted, and there is no implicit default.

search
string
<= 200 characters

Case-insensitive substring match (≤200 chars) against the collection name.

limit
integer
>= 1 <= 100

Max collections per page (1–100). Default 25.

cursor
string

Pagination cursor returned as next_cursor from the previous page.

fields
string

Return only these properties of each collection, instead of the full object. id is always included. Omit for the complete object. Selectable: id, name, description, space_id, organization_id, media_count, media_ids, created_by_id, created_at, updated_at, html_url, sharing.

OK

Media typeapplication/json
object
data
required
Array<object>
object
id
required
string format: uuid
name
required
string
description
required
string
nullable
space_id
required
string format: uuid
organization_id
required
string format: uuid
media_count
required

How many media the collection holds.

integer
media_ids
required

The collection’s media, in display order. Select it only when you need the membership itself — a large collection returns thousands of ids; media_count alone is usually what you want.

Array<string>
created_by_id
required

The user who created the collection; null for collections created before the column existed.

string format: uuid
nullable
created_at
required
string format: date-time
updated_at
required
string format: date-time
html_url
required

Browser URL that opens this collection in the Focal web app. Hand this to users as a clickable link. This is the internal view and needs a Focal account — for a link to send outside the organization use sharing.url.

string
sharing
required

The collection’s share link and the settings that govern it.

object
url
required

The collection’s share link — the browser URL that opens its guest view, with no Focal account needed. Hand this to people outside the organization. Every collection has one; what the other sharing fields control is who gets past it and what they may do once inside.

string
password_protected
required

Whether the share link asks for a password before showing the collection. The password itself is never returned.

boolean
expires_at
required

Calendar day (YYYY-MM-DD) after which the share link stops resolving, or null when it never expires.

string format: date
nullable
allow_download
required

Whether guests may download the collection’s media.

boolean
allow_comments
required

Whether guests may comment on the collection’s media.

boolean
allow_status_change
required

Whether guests may change the status of the collection’s media.

boolean
next_cursor
required

Pass back as cursor to fetch the next page. null on the last page.

string
nullable
has_more
required

true when another page is available. Equivalent to next_cursor !== null.

boolean

Example

{
"data": [
{
"id": "e46511f7-712d-4342-884d-1d4f2a460332",
"name": "Spring lookbook – approved",
"description": "Approved lookbook imagery for the spring launch.",
"space_id": "6916bc3d-e1ab-425b-ac25-eefada01a9a2",
"organization_id": "b46d9033-24b2-4441-87ad-2151088fde01",
"media_count": 2,
"media_ids": [
"786beeda-55ac-4025-bf6e-43b2918e84a9",
"7f114aec-ab11-4877-9b14-82e8c1cced16"
],
"created_by_id": "cfebb6ef-f092-4591-a6e3-e6667ab5a252",
"created_at": "2027-03-04T10:15:00Z",
"updated_at": "2027-03-06T14:42:00Z",
"html_url": "https://app.focal.inc/spaces/6916bc3d-e1ab-425b-ac25-eefada01a9a2/collections/e46511f7-712d-4342-884d-1d4f2a460332",
"sharing": {
"url": "https://app.focal.inc/collections/e46511f7-712d-4342-884d-1d4f2a460332",
"password_protected": true,
"expires_at": "2027-04-30",
"allow_download": true,
"allow_comments": true,
"allow_status_change": false
}
}
],
"next_cursor": "eyJ0IjoiMjAyNy0wMy0wNFQxMDoxNTowMC4wMDBaIiwiaSI6Ijc4NmJlZWRhLTU1YWMtNDAyNS1iZjZlLTQzYjI5MThlODRhOSJ9",
"has_more": true
}

The request was malformed (invalid cursor, unknown type, validation failure, etc.). error.code is bad_request.

Media typeapplication/json

Canonical error envelope. code is stable across releases and intended for programmatic handling; message is human-readable. details only appears for validation failures and lists the offending fields.

object
error
required
object
code
required
string
Allowed values: unauthenticated forbidden not_found bad_request conflict rate_limited internal_error
message
required
string
details
Array<object>
object
field
string
issue
required
string

Example

{
"error": {
"code": "bad_request",
"message": "Invalid request body",
"details": [
{
"field": "space_id",
"issue": "Invalid UUID"
}
]
}
}

Missing, invalid, or disabled token. error.code is unauthenticated.

Media typeapplication/json

Canonical error envelope. code is stable across releases and intended for programmatic handling; message is human-readable. details only appears for validation failures and lists the offending fields.

object
error
required
object
code
required
string
Allowed values: unauthenticated forbidden not_found bad_request conflict rate_limited internal_error
message
required
string
details
Array<object>
object
field
string
issue
required
string

Example

{
"error": {
"code": "unauthenticated",
"message": "Bearer token is missing or invalid"
}
}

The token doesn’t have the scope this endpoint requires. error.code is forbidden.

Media typeapplication/json

Canonical error envelope. code is stable across releases and intended for programmatic handling; message is human-readable. details only appears for validation failures and lists the offending fields.

object
error
required
object
code
required
string
Allowed values: unauthenticated forbidden not_found bad_request conflict rate_limited internal_error
message
required
string
details
Array<object>
object
field
string
issue
required
string

Example

{
"error": {
"code": "forbidden",
"message": "Token doesn't have the required scope"
}
}

Resource doesn’t exist or is outside the token’s space allow-list. The two cases share a response shape so a restricted token can’t probe for the existence of out-of-scope spaces. error.code is not_found.

Media typeapplication/json

Canonical error envelope. code is stable across releases and intended for programmatic handling; message is human-readable. details only appears for validation failures and lists the offending fields.

object
error
required
object
code
required
string
Allowed values: unauthenticated forbidden not_found bad_request conflict rate_limited internal_error
message
required
string
details
Array<object>
object
field
string
issue
required
string

Example

{
"error": {
"code": "not_found",
"message": "Not found"
}
}

Rate limit exceeded. error.code is rate_limited. Wait the number of seconds in the Retry-After header before retrying. Quotas are per-token; see the “Rate limiting” section at the top of this document.

Media typeapplication/json

Canonical error envelope. code is stable across releases and intended for programmatic handling; message is human-readable. details only appears for validation failures and lists the offending fields.

object
error
required
object
code
required
string
Allowed values: unauthenticated forbidden not_found bad_request conflict rate_limited internal_error
message
required
string
details
Array<object>
object
field
string
issue
required
string

Example

{
"error": {
"code": "rate_limited",
"message": "Rate limit of 1000 units per 60s exceeded (this request cost 5)"
}
}
Retry-After
integer
Example
12

Seconds to wait before retrying.