API Documentation
The Simon Quin Productivity API gives you programmatic access to your task workspace. Integrate with your scripts, automation tools, or third-party apps.
Authentication
All endpoints (except /api/status)
require an API key. Pass it in the request header:
X-API-Key: your-api-key-here
Alternatively, use a query parameter:
GET /api/tasks?api_key=your-api-key-here
Find your API key in the Workspace — log in and look in the top-right settings panel. Keep your key secret; it grants full read/write access to your tasks.
Base URL
Production: https://simonquin.com
All paths below are relative to this base URL.
Error Codes
| Status | Meaning | When it occurs |
|---|---|---|
| 200 | OK | Request succeeded |
| 201 | Created | New task was created |
| 400 | Bad Request | Missing or invalid fields in the request body |
| 401 | Unauthorized | Missing or invalid API key |
| 404 | Not Found | Task ID does not exist |
| 500 | Server Error | Something went wrong on our end |
Endpoints
/api/status
No auth required
Health check endpoint. Returns service status and version info.
Response
{
"status": "ok",
"service": "Simon Quin Productivity API",
"version": "1.0",
"docs": "/api/docs"
}
/api/tasks
Auth required
Returns a list of all tasks. Supports optional query filters.
Query Parameters
| Param | Type | Description |
|---|---|---|
| completed | boolean | Filter by completion — true or false |
| category | string | Work · Personal · Health · Finance · Learning · Shopping |
| priority | string | High · Medium · Low |
Response
[
{
"id": 1,
"title": "Finish Q3 report",
"note": "Include revenue breakdown",
"category": "Work",
"priority": "High",
"due_date": "2025-04-15",
"completed": false,
"pinned": true,
"created_at": "2025-04-09T06:00:00"
}
]
/api/tasks
Auth required
Creates a new task. Returns the created task object with status 201.
Request Body (JSON)
{
"title": "Buy groceries", // required
"note": "Milk, eggs, bread", // optional
"category": "Shopping", // optional
"priority": "Medium", // optional
"due_date": "2025-04-10" // optional YYYY-MM-DD
}
/api/tasks/:id
Auth required
Returns a single task by its numeric ID. Returns 404 if not found.
/api/tasks/:id
Auth required
Updates any fields of an existing task. Only include the fields you want to change.
{
"priority": "High",
"due_date": "2025-04-20"
}
/api/tasks/:id
Auth required
Permanently deletes a task. Returns {"deleted": true} on success.
/api/tasks/:id/toggle
Auth required
Toggles the completed status of a task. No request body needed. Returns the updated task.
Code Examples
cURL
List all tasks
curl -X GET "https://simonquin.com/api/tasks" \
-H "X-API-Key: YOUR_API_KEY"
Create a task
curl -X POST "https://simonquin.com/api/tasks" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"title":"Review proposal","priority":"High","category":"Work"}'
Toggle completion
curl -X PATCH "https://simonquin.com/api/tasks/1/toggle" \
-H "X-API-Key: YOUR_API_KEY"
Python
import requests API_KEY = "YOUR_API_KEY" BASE_URL = "https://simonquin.com/api" HEADERS = {"X-API-Key": API_KEY, "Content-Type": "application/json"} # List all tasks r = requests.get(f"{BASE_URL}/tasks", headers=HEADERS) tasks = r.json() # Create a task new = requests.post(f"{BASE_URL}/tasks", headers=HEADERS, json={ "title": "Read documentation", "priority": "Medium", "category": "Learning" }) print(new.json()) # Toggle task 1 requests.patch(f"{BASE_URL}/tasks/1/toggle", headers=HEADERS)
JavaScript (fetch)
const API_KEY = 'YOUR_API_KEY'; const BASE_URL = 'https://simonquin.com/api'; const headers = { 'X-API-Key': API_KEY, 'Content-Type': 'application/json' }; // List tasks const res = await fetch(`${BASE_URL}/tasks`, { headers }); const tasks = await res.json(); // Create a task await fetch(`${BASE_URL}/tasks`, { method: 'POST', headers, body: JSON.stringify({ title: 'Ship the new feature', priority: 'High', category: 'Work' }) }); // Delete task 3 await fetch(`${BASE_URL}/tasks/3`, { method: 'DELETE', headers });