Endpoints
List your apps
The apps your key can see, newest first, with search and pages.
https://www.setherion.com/api/v1/projectsPlan: Every plan
Returns the apps on your dashboard: your own, the ones in workspaces you belong to and the ones shared with you, most recently changed first. Deleted apps are not included. Any role is enough, viewers included.
Apps come 100 at a time. total says how many match, and while more follow, truncated is true and nextOffset says where the next page starts. To find one app without reading them all, search with q.
Listing is free and does not use credits.
Request
curl https://www.setherion.com/api/v1/projects \
-H "Authorization: Bearer $SETHERION_API_KEY"To search, add q. It matches the words anywhere in an app's name or description, in any case:
curl "https://www.setherion.com/api/v1/projects?q=coffee" \
-H "Authorization: Bearer $SETHERION_API_KEY"For the next page, add offset with the nextOffset of the answer before:
curl "https://www.setherion.com/api/v1/projects?offset=100" \
-H "Authorization: Bearer $SETHERION_API_KEY"| Parameter | Meaning |
|---|---|
q | Optional. Text to find in the app's name or description. Spaces around it are ignored. Up to 100 characters. A % or _ in it is taken literally, so searching for 50% does not match every app. |
offset | Optional. Where the page starts, counting from 0: the nextOffset of the previous answer. A whole number of up to six digits. |
The order is by last change, with the app's id breaking a tie, so two apps changed in the same instant never swap places between one page and the next. An app changed between two page requests moves to the top of the list, so read the pages in one go.
Response
The first page of an account with more than 100 apps:
{
"ok": true,
"total": 142,
"truncated": true,
"offset": 0,
"nextOffset": 100,
"projects": [
{
"id": "7c1e4a52-9b0d-4f3e-8a61-2d5f0c9e7b14",
"name": "Coffee shop",
"description": "Website for a coffee shop in Leeds",
"url": "https://coffee-shop.setherion.app",
"updatedAt": "2026-09-19T10:42:07.000Z"
},
{
"id": "0e9d3b6a-41c2-4d7f-b8a5-6f1c2a9d4e30",
"name": "Booking tool",
"description": null,
"url": null,
"updatedAt": "2026-09-18T16:03:51.000Z"
}
]
}(The projects array holds up to 100 entries. Two are shown.)
| Field | Type | Meaning |
|---|---|---|
total | number | How many apps match, including any not on this page. |
truncated | boolean | true when more apps follow this page. |
offset | number | Where this page starts. |
nextOffset | number or null | Where the next page starts, or null on the last one. |
id | string | The app's id. Use it to edit or publish the app. |
name | string | The app's name, as on your dashboard. |
description | string or null | The app's description, if it has one. |
url | string or null | Where the app is online, or null if it is not published. |
updatedAt | string | When the app last changed, in ISO 8601. |
A page past the end is not an error: it answers ok: true with an empty projects list.
Read every page
const base = 'https://www.setherion.com/api/v1/projects'
const headers = { Authorization: `Bearer ${process.env.SETHERION_API_KEY}` }
let offset = 0
const all = []
while (offset !== null) {
const page = await fetch(`${base}?offset=${offset}`, { headers }).then(r => r.json())
if (!page.ok) throw new Error(page.error)
all.push(...page.projects)
offset = page.nextOffset
}Errors
| Status | When |
|---|---|
400 | q is longer than 100 characters, or offset is not a whole number. |
401 | The key is missing, wrong or revoked. |
500 | The list could not be read. Try again. |
The exact sentences
| Status | error |
|---|---|
400 | q is at most 100 characters. |
400 | offset is a whole number, 0 or more. |
500 | Could not list your apps. |
Was this page helpful?
