端点
列出你的应用
你的密钥能看到的应用,最新的在前,支持搜索和分页。
GET
https://www.setherion.com/api/v1/projects套餐: 所有套餐
返回你仪表盘上的应用:你自己的、你所在工作区中的,以及与你共享的,最近更改的排在最前。已删除的应用不包括在内。任何角色都可以,查看者也一样。
应用每次返回 100 个。total 告诉你有多少个匹配,后面还有更多时,truncated 为 true,nextOffset 说明下一页从哪里开始。想找某一个应用而不必读完所有应用,可以用 q 搜索。
列出应用是免费的,不会用到积分。
请求
bash
curl https://www.setherion.com/api/v1/projects \
-H "Authorization: Bearer $SETHERION_API_KEY"要搜索,加上 q。它会在应用的名称或描述的任何位置匹配这些词,不区分大小写:
bash
curl "https://www.setherion.com/api/v1/projects?q=coffee" \
-H "Authorization: Bearer $SETHERION_API_KEY"要获取下一页,加上 offset,值为上一次响应中的 nextOffset:
bash
curl "https://www.setherion.com/api/v1/projects?offset=100" \
-H "Authorization: Bearer $SETHERION_API_KEY"| 参数 | 含义 |
|---|---|
q | 可选。要在应用的名称或描述中查找的文字。前后的空格会被忽略。最多 100 个字符。其中的 % 或 _ 按字面处理,所以搜索 50% 不会匹配所有应用。 |
offset | 可选。这一页的起点,从 0 开始计数:即上一次响应中的 nextOffset。最多六位的整数。 |
排序依据是最近一次更改,应用的 id 用来决定相同时间的先后,所以在同一时刻更改的两个应用,在不同页之间永远不会互换位置。在两次请求页面之间被更改的应用会移到列表顶部,所以请一次性读完所有页面。
响应
一个应用超过 100 个的账户的第一页:
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"
}
]
}(projects 数组最多包含 100 项,这里只显示了两项。)
| 字段 | 类型 | 含义 |
|---|---|---|
total | number | 匹配的应用数量,包括不在这一页上的。 |
truncated | boolean | 这一页之后还有更多应用时为 true。 |
offset | number | 这一页的起点。 |
nextOffset | number or null | 下一页的起点,最后一页上为 null。 |
id | string | 应用的 id。用它来修改或发布应用。 |
name | string | 应用的名称,与你仪表盘上的一致。 |
description | string or null | 应用的描述,如果有的话。 |
url | string or null | 应用上线的地址,未发布时为 null。 |
updatedAt | string | 应用最近一次更改的时间,采用 ISO 8601 格式。 |
超出末尾的页面不算错误:它返回 ok: true 和一个空的 projects 列表。
读取所有页面
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
}错误
| 状态码 | 何时出现 |
|---|---|
400 | q 超过 100 个字符,或 offset 不是整数。 |
401 | 密钥缺失、错误或已被撤销。 |
500 | 无法读取列表。再试一次。 |
确切的提示语
| 状态码 | error |
|---|---|
400 | q is at most 100 characters. |
400 | offset is a whole number, 0 or more. |
500 | Could not list your apps. |
这个页面对你有帮助吗?
