Endpoints

List your apps

The apps your key can see, newest first, with search and pages.

GEThttps://www.setherion.com/api/v1/projects

Plan: 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

bash
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:

bash
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:

bash
curl "https://www.setherion.com/api/v1/projects?offset=100" \
  -H "Authorization: Bearer $SETHERION_API_KEY"
ParameterMeaning
qOptional. 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.
offsetOptional. 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:

json
{
  "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.)

FieldTypeMeaning
totalnumberHow many apps match, including any not on this page.
truncatedbooleantrue when more apps follow this page.
offsetnumberWhere this page starts.
nextOffsetnumber or nullWhere the next page starts, or null on the last one.
idstringThe app's id. Use it to edit or publish the app.
namestringThe app's name, as on your dashboard.
descriptionstring or nullThe app's description, if it has one.
urlstring or nullWhere the app is online, or null if it is not published.
updatedAtstringWhen 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

js
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

StatusWhen
400q is longer than 100 characters, or offset is not a whole number.
401The key is missing, wrong or revoked.
500The list could not be read. Try again.
The exact sentences
Statuserror
400q is at most 100 characters.
400offset is a whole number, 0 or more.
500Could not list your apps.

Was this page helpful?

Join the community

Questions, ideas and what others are building.