Utilities
Small, self-contained personal tools — widgets from the Home dashboard, migrated one at a time.
Widgets
GET /todos
List the caller's own personal to-do items
User keyExample request
curl -X GET "https://api.openstudio.one/v1/todos" \
-H "X-Api-User-Key: YOUR_USER_KEY"<?php
$ch = curl_init('https://api.openstudio.one/v1/todos');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['X-Api-User-Key: YOUR_USER_KEY']);
$response = curl_exec($ch);
$data = json_decode($response, true);import requests
headers = {
"X-Api-User-Key": "YOUR_USER_KEY",
}
response = requests.get("https://api.openstudio.one/v1/todos", headers=headers)
data = response.json()fetch('https://api.openstudio.one/v1/todos', {
method: 'GET',
headers: {
'X-Api-User-Key': 'YOUR_USER_KEY'
}
})
.then(res => res.json())
.then(data => console.log(data));ⓘRuns a real request from your browser directly to todos. Keys are only held in this page's memory while you're here — never stored, never sent anywhere else.
Response fields
| Field | Type | Flags | Notes |
|---|---|---|---|
| items | array of objects | — | Every to-do item belonging to the caller. |
| ↳id | integer | — | — |
| ↳title | string | — | — |
| ↳due_date | string | YYYY-MM-DD, or null if unset. |
|
| ↳starred | boolean | — | The web widget's own star-icon toggle — a plain flag, not a priority scale. |
| ↳done | boolean | — | — |
| ↳created_at | string | — | YYYY-MM-DD HH:MM:SS. |
Example response
{
"success": true,
"data": {
"items": [
{
"id": 42,
"title": "Review Q3 budget",
"due_date": "2026-08-29",
"starred": true,
"done": false,
"created_at": "2026-08-20 09:14:02"
}
]
},
"error": null
}POST /todos
Create a to-do item
User keyRequest body
| Field | Type | Flags | Required | Notes |
|---|---|---|---|---|
| title | string | — | Required | The to-do's title. |
| due_date | string | — | Optional | YYYY-MM-DD. Omit for no due date. |
Example request
curl -X POST "https://api.openstudio.one/v1/todos" \
-H "X-Api-User-Key: YOUR_USER_KEY" \
-H "Content-Type: application/json" \
-d '{"title":"...","due_date":"..."}'<?php
$ch = curl_init('https://api.openstudio.one/v1/todos');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
'title' => '...',
'due_date' => '...',
]));
curl_setopt($ch, CURLOPT_HTTPHEADER, ['X-Api-User-Key: YOUR_USER_KEY', 'Content-Type: application/json']);
$response = curl_exec($ch);
$data = json_decode($response, true);import requests
headers = {
"X-Api-User-Key": "YOUR_USER_KEY",
}
body = {
'title': '...',
'due_date': '...',
}
response = requests.post("https://api.openstudio.one/v1/todos", headers=headers, json=body)
data = response.json()fetch('https://api.openstudio.one/v1/todos', {
method: 'POST',
headers: {
'X-Api-User-Key': 'YOUR_USER_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
'title': '...',
'due_date': '...',
})
})
.then(res => res.json())
.then(data => console.log(data));Response fields
| Field | Type | Flags | Notes |
|---|---|---|---|
| id | integer | — | — |
| title | string | — | — |
| due_date | string | — | |
| starred | boolean | — | Always false on creation. |
| done | boolean | — | — |
| created_at | string | — | — |
Example response
{
"success": true,
"data": {
"id": 43,
"title": "Call the printer vendor",
"due_date": null,
"starred": false,
"done": false,
"created_at": "2026-08-24 10:02:11"
},
"error": null
}PATCH /todos/{id}
Update a to-do item, and/or toggle it done/starred
User keyRequest body
| Field | Type | Flags | Required | Notes |
|---|---|---|---|---|
| title | string | — | Optional | A new title for the to-do. |
| due_date | string | Optional | YYYY-MM-DD, or null/empty string to clear it. |
|
| starred | boolean | — | Optional | The web widget's own star-icon toggle — a plain flag, not a priority scale. |
| done | boolean | — | Optional | Whether the to-do is marked done. |
Example request
curl -X PATCH "https://api.openstudio.one/v1/todos/{id}" \
-H "X-Api-User-Key: YOUR_USER_KEY" \
-H "Content-Type: application/json" \
-d '{"title":"...","due_date":"...","starred":true,"done":true}'<?php
$ch = curl_init('https://api.openstudio.one/v1/todos/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PATCH');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
'title' => '...',
'due_date' => '...',
'starred' => true,
'done' => true,
]));
curl_setopt($ch, CURLOPT_HTTPHEADER, ['X-Api-User-Key: YOUR_USER_KEY', 'Content-Type: application/json']);
$response = curl_exec($ch);
$data = json_decode($response, true);import requests
headers = {
"X-Api-User-Key": "YOUR_USER_KEY",
}
body = {
'title': '...',
'due_date': '...',
'starred': True,
'done': True,
}
response = requests.patch("https://api.openstudio.one/v1/todos/{id}", headers=headers, json=body)
data = response.json()fetch('https://api.openstudio.one/v1/todos/{id}', {
method: 'PATCH',
headers: {
'X-Api-User-Key': 'YOUR_USER_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
'title': '...',
'due_date': '...',
'starred': true,
'done': true,
})
})
.then(res => res.json())
.then(data => console.log(data));Response fields
| Field | Type | Flags | Notes |
|---|---|---|---|
| id | integer | — | — |
| title | string | — | — |
| due_date | string | — | |
| starred | boolean | — | — |
| done | boolean | — | — |
| created_at | string | — | — |
Example response
{
"success": true,
"data": {
"id": 42,
"title": "Review Q3 budget",
"due_date": "2026-08-29",
"starred": true,
"done": true,
"created_at": "2026-08-20 09:14:02"
},
"error": null
}DELETE /todos/{id}
Delete a to-do item
User keyExample request
curl -X DELETE "https://api.openstudio.one/v1/todos/{id}" \
-H "X-Api-User-Key: YOUR_USER_KEY"<?php
$ch = curl_init('https://api.openstudio.one/v1/todos/{id}');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['X-Api-User-Key: YOUR_USER_KEY']);
$response = curl_exec($ch);
$data = json_decode($response, true);import requests
headers = {
"X-Api-User-Key": "YOUR_USER_KEY",
}
response = requests.delete("https://api.openstudio.one/v1/todos/{id}", headers=headers)
data = response.json()fetch('https://api.openstudio.one/v1/todos/{id}', {
method: 'DELETE',
headers: {
'X-Api-User-Key': 'YOUR_USER_KEY'
}
})
.then(res => res.json())
.then(data => console.log(data));Response fields
| Field | Type | Flags | Notes |
|---|
Example response
{
"success": true,
"data": {},
"error": null
}GET /notes
Get the caller's personal notepad content
User keyExample request
curl -X GET "https://api.openstudio.one/v1/notes" \
-H "X-Api-User-Key: YOUR_USER_KEY"<?php
$ch = curl_init('https://api.openstudio.one/v1/notes');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['X-Api-User-Key: YOUR_USER_KEY']);
$response = curl_exec($ch);
$data = json_decode($response, true);import requests
headers = {
"X-Api-User-Key": "YOUR_USER_KEY",
}
response = requests.get("https://api.openstudio.one/v1/notes", headers=headers)
data = response.json()fetch('https://api.openstudio.one/v1/notes', {
method: 'GET',
headers: {
'X-Api-User-Key': 'YOUR_USER_KEY'
}
})
.then(res => res.json())
.then(data => console.log(data));ⓘRuns a real request from your browser directly to notes. Keys are only held in this page's memory while you're here — never stored, never sent anywhere else.
Response fields
| Field | Type | Flags | Notes |
|---|---|---|---|
| content | string | — | Empty string if the caller has never saved anything yet. |
Example response
{
"success": true,
"data": {
"content": "Follow up with finance on the Q3 numbers.\nAsk Priya about the vendor contract renewal."
},
"error": null
}PATCH /notes
Replace the caller's personal notepad content
User keyRequest body
| Field | Type | Flags | Required | Notes |
|---|---|---|---|---|
| content | string | — | Required | The full new content. Send an empty string to clear it. |
Example request
curl -X PATCH "https://api.openstudio.one/v1/notes" \
-H "X-Api-User-Key: YOUR_USER_KEY" \
-H "Content-Type: application/json" \
-d '{"content":"..."}'<?php
$ch = curl_init('https://api.openstudio.one/v1/notes');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PATCH');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
'content' => '...',
]));
curl_setopt($ch, CURLOPT_HTTPHEADER, ['X-Api-User-Key: YOUR_USER_KEY', 'Content-Type: application/json']);
$response = curl_exec($ch);
$data = json_decode($response, true);import requests
headers = {
"X-Api-User-Key": "YOUR_USER_KEY",
}
body = {
'content': '...',
}
response = requests.patch("https://api.openstudio.one/v1/notes", headers=headers, json=body)
data = response.json()fetch('https://api.openstudio.one/v1/notes', {
method: 'PATCH',
headers: {
'X-Api-User-Key': 'YOUR_USER_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
'content': '...',
})
})
.then(res => res.json())
.then(data => console.log(data));Response fields
| Field | Type | Flags | Notes |
|---|---|---|---|
| content | string | — | — |
Example response
{
"success": true,
"data": {
"content": "Follow up with finance on the Q3 numbers."
},
"error": null
}