Overview (read this first, AI)

This service tracks software projects and their step-by-step history. There are exactly two write endpoints, both POST only. Send application/json (preferred) or form-encoded data. Every response is JSON shaped as {"success": bool, "message": string, "data": object|null}.

Authentication: every POST must include the API key — either as field api_key in the body, or as HTTP header X-Api-Key. The key lives in config.php on the server.

Workflow for an AI assistant

  1. When starting a brand-new project, POST to the create endpoint with name, framework, and next_action.
  2. Every time a meaningful step is completed, POST to the update endpoint with notes describing what was done and next_action describing what comes next.
  3. If create returns HTTP 409, the project already exists - switch to the update endpoint.
  4. Always check that the JSON response has "success": true; if false, read "message" for the reason.

1. Create Project

POST https://www.projectmanager.claudeaiplugin.com/create-project.php

FieldTypeRequiredRules
api_keystringYESMust match the server key (or use header X-Api-Key).
namestringYESUnique project name, max 190 chars.
frameworkstringnoTech stack label, max 120 chars. Example: "WinUI 3 / .NET 8".
date_startedstringnoFormat Y-m-d. Defaults to today.
notesstringnoFirst timeline entry. Defaults to "Project created."
next_actionstringnoWhat should happen next on this project.

Example JSON body

{
    "api_key": "YOUR_API_KEY_HERE",
    "name": "QuickShot Screen Shot",
    "framework": "WinUI 3 / .NET 8",
    "date_started": "2026-06-13",
    "notes": "Scaffolded solution, 4-layer architecture in place.",
    "next_action": "Implement capture engine and hotkey service."
}

Example - curl

curl -X POST "https://www.projectmanager.claudeaiplugin.com/create-project.php" \
  -H "Content-Type: application/json" \
  -H "X-Api-Key: YOUR_API_KEY_HERE" \
  -d '{"name":"My New App","framework":"PHP / MySQLi","next_action":"Design schema"}'

Error codes: 400 validation · 401 bad api key · 405 not POST · 409 duplicate name (use update endpoint instead) · 500 database

2. Update Project (append a timeline step)

POST https://www.projectmanager.claudeaiplugin.com/update-project.php

FieldTypeRequiredRules
api_keystringYESMust match the server key (or use header X-Api-Key).
idintegerone of id / nameProject id. Alias "project_id" also accepted.
namestringone of id / nameExact project name - used only when "id" is absent.
notesstringYESDescription of the action that was taken. Becomes a timeline entry.
next_actionstringnoThe next step to take. Overwrites the project next-action summary.
frameworkstringnoIf provided, updates the project framework label.
action_datestringnoFormat Y-m-d H:i:s. Defaults to now. Back-dated entries are added to the timeline but never overwrite a newer summary.

Example JSON body

{
    "api_key": "YOUR_API_KEY_HERE",
    "id": 1,
    "notes": "Capture engine complete. Build succeeded with zero errors.",
    "next_action": "Package as MSIX and submit to Partner Center."
}

Example - PowerShell

$body = @{
    api_key     = 'YOUR_API_KEY_HERE'
    id          = 1
    notes       = 'Fixed all build errors. dotnet build = SUCCESS.'
    next_action = 'Run end-to-end test, then submit to Microsoft Store.'
} | ConvertTo-Json

Invoke-RestMethod -Method Post -Uri 'https://www.projectmanager.claudeaiplugin.com/update-project.php' `
    -ContentType 'application/json' -Body $body

Error codes: 400 validation · 401 bad api key · 404 project not found · 405 not POST · 500 database

3. Response Format

Success (HTTP 200)

{
    "success": true,
    "message": "Project updated.",
    "data": {
        "project_id": 1,
        "project_name": "My New App",
        "action_id": 14,
        "action_date": "2026-06-13 04:49:39",
        "summary_updated": true,
        "project_url": "https://www.projectmanager.claudeaiplugin.com/project.php?id=1"
    }
}

Failure (HTTP 4xx / 5xx)

{
    "success": false,
    "message": "Field \"notes\" is required - describe the action that was taken.",
    "data": null
}

An AI should treat any response where success is false — or any non-200 HTTP status — as a failure and read message for the exact reason.