{"openapi":"3.1.0","info":{"title":"Taskyard API","version":"1.2.0","description":"Task & project management API with lane/board support, push notifications, reminders, and billing. Use x-api-key header or ?apiKey= query param for auth."},"servers":[{"url":"https://taskyard.meetingmind.space","description":"Production"}],"security":[{"ApiKeyAuth":[]},{"OAuth2":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"x-api-key","description":"Your API key (starts with tr_). Get one from Settings in the web app."},"OAuth2":{"type":"oauth2","flows":{"authorizationCode":{"authorizationUrl":"https://taskyard.meetingmind.space/oauth/authorize","tokenUrl":"https://taskyard.meetingmind.space/oauth/token","scopes":{"tasks":"Full access to tasks and projects"}}}}},"schemas":{"User":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string","format":"email"},"name":{"type":"string"},"plan":{"type":"string","enum":["free","starter","pro","ultimate"]},"apiKey":{"type":"string"},"createdAt":{"type":"string","format":"date-time"}}},"Project":{"type":"object","properties":{"id":{"type":"string"},"userId":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"archived":{"type":"boolean"},"lanes":{"type":"string","description":"JSON array of lane names, e.g. [\"ToDo\",\"In Progress\",\"Completed\"]. Empty array [] means flat list."},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"_count":{"type":"object","properties":{"tasks":{"type":"integer"}}}}},"Task":{"type":"object","properties":{"id":{"type":"string"},"projectId":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"status":{"type":"string","enum":["pending","completed"]},"lane":{"type":"string","description":"Lane/column name (e.g. \"ToDo\", \"In Progress\"). Empty string when project has no lanes."},"isRepetitive":{"type":"boolean"},"repeatType":{"type":"string","enum":["daily","weekly","monthly"],"nullable":true},"repeatInterval":{"type":"integer","nullable":true},"remindAt":{"type":"string","format":"date-time","nullable":true},"reminderSent":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"project":{"$ref":"#/components/schemas/Project"}}},"Stats":{"type":"object","properties":{"projects":{"type":"integer"},"tasks":{"type":"integer"},"pendingTasks":{"type":"integer"},"reminders":{"type":"integer"},"pendingReminders":{"type":"integer"}}}}},"paths":{"/api/auth/signup":{"post":{"operationId":"signup","summary":"Sign up","description":"Create a new account with email and password.","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email","password","name"],"properties":{"email":{"type":"string","format":"email"},"password":{"type":"string","minLength":6},"name":{"type":"string"}}}}}},"responses":{"200":{"description":"Account created","content":{"application/json":{"schema":{"type":"object","properties":{"user":{"$ref":"#/components/schemas/User"},"token":{"type":"string"},"apiKey":{"type":"string"}}}}}}}}},"/api/auth/login":{"post":{"operationId":"login","summary":"Log in","description":"Authenticate with email and password.","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email","password"],"properties":{"email":{"type":"string"},"password":{"type":"string"}}}}}},"responses":{"200":{"description":"Authenticated","content":{"application/json":{"schema":{"type":"object","properties":{"user":{"$ref":"#/components/schemas/User"},"token":{"type":"string"},"apiKey":{"type":"string"}}}}}}}}},"/api/me":{"get":{"operationId":"getMe","summary":"Get current user","description":"Returns profile, plan, and subscription info.","responses":{"200":{"description":"User info"}}}},"/api/stats":{"get":{"operationId":"getStats","summary":"Get workspace stats","description":"Counts of projects, tasks, pending tasks, reminders, and due reminders.","responses":{"200":{"description":"Statistics","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Stats"}}}}}}},"/api/projects":{"get":{"operationId":"listProjects","summary":"List projects","description":"Returns active projects. Add ?includeArchived=true to include archived ones.","parameters":[{"name":"includeArchived","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Project list","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Project"}}}}}}},"post":{"operationId":"createProject","summary":"Create a project","description":"Creates a new project with optional description.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string"},"description":{"type":"string"}}}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project"}}}}}}},"/api/projects/{id}":{"get":{"operationId":"getProject","summary":"Get project with tasks","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Project with tasks","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Project"},{"type":"object","properties":{"tasks":{"type":"array","items":{"$ref":"#/components/schemas/Task"}}}}]}}}}}},"put":{"operationId":"updateProject","summary":"Update project","description":"Update project name, description, archive status, or lanes. When lanes change, tasks in removed lanes are moved to the first lane. Set lanes to [] for flat list.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"archived":{"type":"boolean"},"lanes":{"type":"array","items":{"type":"string"},"description":"Lane names. Provide 2+ for board view, [] for flat list, or omit to keep unchanged."}}}}}},"responses":{"200":{"description":"Updated"}}},"delete":{"operationId":"deleteProject","summary":"Delete project and all its tasks","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Deleted"}}}},"/api/projects/{id}/lanes":{"put":{"operationId":"updateProjectLanes","summary":"Update project lanes only","description":"Change lane configuration without affecting name/description. Tasks in removed lanes move to the first lane.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["lanes"],"properties":{"lanes":{"type":"array","items":{"type":"string"},"description":"Lane names. Provide 2+ for board view, [] for flat list."}}}}}},"responses":{"200":{"description":"Lanes updated"}}}},"/api/tasks":{"get":{"operationId":"listTasks","summary":"List tasks","parameters":[{"name":"projectId","in":"query","schema":{"type":"string"},"description":"Filter by project"}],"responses":{"200":{"description":"Task list","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Task"}}}}}}},"post":{"operationId":"createTask","summary":"Create a task","description":"Create a task in a project. Optionally specify lane, repeat, or reminder.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["projectId","title"],"properties":{"projectId":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"lane":{"type":"string","description":"Lane/column name (e.g. \"ToDo\", \"In Progress\"). Defaults to first project lane."},"status":{"type":"string","enum":["pending","completed"]},"isRepetitive":{"type":"boolean"},"repeatType":{"type":"string","enum":["daily","weekly","monthly"]},"remindAt":{"type":"string","format":"date-time","description":"ISO datetime for reminder"}}}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Task"}}}}}}},"/api/tasks/{id}":{"put":{"operationId":"updateTask","summary":"Update task","description":"Update any task field. To move between lanes, set the lane parameter. To clear a field, set it to null.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string"},"description":{"type":"string"},"status":{"type":"string","enum":["pending","completed"],"description":"Set to 'completed' to mark done"},"lane":{"type":"string","description":"Move task to this lane/column (e.g. \"In Progress\", \"Completed\")"},"projectId":{"type":"string","description":"Move task to a different project"},"isRepetitive":{"type":"boolean"},"repeatType":{"type":"string","nullable":true,"enum":["daily","weekly","monthly"]},"remindAt":{"type":"string","format":"date-time","nullable":true,"description":"Set to null to remove reminder"}}}}}},"responses":{"200":{"description":"Updated"}}},"delete":{"operationId":"deleteTask","summary":"Delete task","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Deleted"}}}},"/api/tasks/{id}/lane":{"patch":{"operationId":"updateTaskLane","summary":"Move task to a different lane","description":"Quick endpoint to update only the lane of a task.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["lane"],"properties":{"lane":{"type":"string","description":"Target lane name"}}}}}},"responses":{"200":{"description":"Lane updated"}}}},"/api/tasks/{id}/complete":{"post":{"operationId":"completeTask","summary":"Complete a task","description":"Marks task done. For repetitive tasks, auto-creates the next instance.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Completed"}}}},"/api/ai/parse":{"post":{"operationId":"aiParseTask","summary":"Parse natural language into a task","description":"AI-powered: converts text like 'review PR tomorrow at 3pm' into a task with project, title, and reminder.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text"],"properties":{"text":{"type":"string"}}}}}},"responses":{"200":{"description":"Parsed task result"}}}}}}