Open API v1: call WidgetStore with a personal token
WidgetStore Open API v1 reference. Use a personal API token to update your status, create widgets, add links, cards, to-dos and habits, and read or write My Data.
Everything MCP can do, the Open API can do too, which makes it a good fit for scripts, iOS Shortcuts and automation tools. First create a personal API token in Settings → API & AI connections.
Basics
- Base URL:
https://widgetstore.net/widget/api/v1 - Auth: header
Authorization: Bearer wsp_… - Body: JSON (
Content-Type: application/json) - Dates:
YYYY-MM-DD; “today” is based on Beijing time (UTC+8)
Example: update your status
curl -X PUT https://widgetstore.net/widget/api/v1/me/status \
-H "Authorization: Bearer wsp_…" \
-H "Content-Type: application/json" \
-d '{"text":"On vacation in Kyoto, back next week","emoji":"🏖"}'
A successful response:
{
"code": 0,
"data": { … },
"summary": "Status set to \"🏖 On vacation in Kyoto, back next week\" on personal page …",
"links": { "page": "…" },
"operationId": "…"
}
summary is a short human-readable description. Endpoints that change something return an operationId you can use to undo.
Endpoints
| Method and path | What it does | Permission |
|---|---|---|
GET /me | Overview of your space: widgets, page, start pages, to-dos, tables | Read |
PUT /me/status | Update your status: text (≤140 chars), emoji; clear: true clears it | Status |
GET /me/widgets?limit= | Your widgets, with embed links | Read |
POST /me/widgets | Create a widget: widget (ID or slug), values, title, lang | Widgets |
PATCH /me/widgets/{id} | Edit a widget: values (only the fields you send), title | Widgets |
POST /me/countdowns | Create a countdown: title, date, mode (countdown / anniversary / countup), repeat | Widgets |
GET /widget-types?category=&type=&lang= | Widget types in the library | — |
GET /widget-types/search?q=&lang= | Search widgets by description, with their fields | — |
POST /me/startpages/links | Add a site to a start page: url, name, optional startPage, page | Start pages |
POST /me/page/cards | Add a card to your page: type (link / text / title / widget), url, title, text, size, position | Personal page |
POST /me/focus/todos | Add a to-do: title, due, estimateMinutes, priority | Focus |
POST /me/focus/habits/{habit name}/check-in | Check in a habit: date, count, note | Focus |
POST /me/focus/sessions | Log focus time: minutes, task, date, mode | Focus |
GET /me/tables | My Data: list tables | Read |
GET /me/tables/{table name or ID}/records?from=&to=&limit= | Look up records | Read |
POST /me/tables/{table name or ID}/records | Add a record: values, date | My Data |
POST /me/operations/{operationId}/undo | Undo a change | — |
Search and type listings need no extra permission, but still require a token and count toward your calls. There are no delete endpoints.
Errors
On errors the HTTP status isn't 200 and the body is { "code": status, "msg": "error_code", … }:
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_json / invalid_params | Body isn't JSON, or a field is wrong (see errors) |
| 400 | blocked_words | Public text failed the content safety check |
| 401 | unauthorized / token_invalid / token_expired / token_revoked | Missing, wrong, expired or revoked token |
| 403 | insufficient_scope | The token lacks this permission (required names it) |
| 403 | pro_required | This widget needs Pro |
| 404 | not_found / widget_not_found / table_not_found / start_page_not_found … | Not found |
| 409 | undo_not_allowed | Can't undo (reason: already_undone / too_old / newer_change / not_undoable) |
| 429 | rate_limited / api_daily_limit | Per-minute or daily limit reached (retry after retryAfter seconds) |
| 503 | api_paused | The API is temporarily paused (maintenance or heavy load) |
Limits
Free: 100 calls a day, 30 of them changes, 20 per minute. Pro: 300, 100 and 60. Limits are shared with MCP; see Tokens & activity.
Legacy endpoint
/api/v1/widgets/instances (create, edit and read widget instances) also accepts personal tokens: POST needs the Widgets permission and GET needs Read. These calls are logged and counted the same way. New code should use /me/widgets above.
Last updated: Oct 22, 2026