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 key

Example 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

FieldTypeFlagsNotes
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 key

Request body

FieldTypeFlagsRequiredNotes
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

FieldTypeFlagsNotes
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 key

Request body

FieldTypeFlagsRequiredNotes
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

FieldTypeFlagsNotes
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 key

Example 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

FieldTypeFlagsNotes

Example response

{
    "success": true,
    "data": {},
    "error": null
}

GET /notes

Get the caller's personal notepad content

User key

Example 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

FieldTypeFlagsNotes
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 key

Request body

FieldTypeFlagsRequiredNotes
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

FieldTypeFlagsNotes
content string — —

Example response

{
    "success": true,
    "data": {
        "content": "Follow up with finance on the Q3 numbers."
    },
    "error": null
}
ESC