REST API · Version 1.0

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.

Contact

simonquinwedding@gmail.com

Phone

0480 218 240

Website

simonquin.com

Live Status

Operational

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

GET /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"
}
GET /api/tasks Auth required

Returns a list of all tasks. Supports optional query filters.

Query Parameters

ParamTypeDescription
completedbooleanFilter by completion — true or false
categorystringWork · Personal · Health · Finance · Learning · Shopping
prioritystringHigh · 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"
  }
]
POST /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
}
GET /api/tasks/:id Auth required

Returns a single task by its numeric ID. Returns 404 if not found.

PUT /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"
}
DELETE /api/tasks/:id Auth required

Permanently deletes a task. Returns {"deleted": true} on success.

PATCH /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 });
© 2025 Simon Quin  ·  simonquinwedding@gmail.com  ·  0480 218 240