{"openapi":"3.0.3","info":{"title":"Todo API","version":"1.0.0","description":"CRUD API for todos - built with Codehooks.io"},"servers":[],"paths":{"/api/todos":{"get":{"summary":"List todos","description":"Retrieve a list of todos with optional filtering and pagination","tags":["Todos"],"operationId":"listTodos","parameters":[{"name":"q","in":"query","description":"MongoDB-style query filter as JSON string, e.g. {\"status\":\"active\"}","required":false,"schema":{"type":"string"}},{"name":"h","in":"query","description":"Query hints as JSON: {\"$limit\":10,\"$offset\":0,\"$fields\":{\"name\":1},\"$sort\":{\"created\":-1}}","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","description":"Maximum number of items to return","required":false,"schema":{"type":"integer","default":100}},{"name":"offset","in":"query","description":"Number of items to skip","required":false,"schema":{"type":"integer","default":0}},{"name":"sort","in":"query","description":"Sort field (prefix with - for descending)","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"List of todos","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Todos"}}}}},"400":{"description":"Invalid query parameters"},"404":{"description":"Collection schema not found"}}},"post":{"summary":"Create todo","description":"Create a new document in todos (validated against schema)","tags":["Todos"],"operationId":"createTodo","requestBody":{"required":true,"description":"Todo data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Todos"}}}},"responses":{"201":{"description":"Todo created successfully","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Todos"},{"type":"object","properties":{"_id":{"type":"string","description":"Unique document ID"}}}]}}}},"400":{"description":"Validation error or invalid request"}}}},"/api/todos/_byquery":{"patch":{"summary":"Batch update todos","description":"Update multiple todos documents matching a query","tags":["Todos"],"operationId":"updateManyTodos","parameters":[{"name":"q","in":"query","description":"MongoDB-style query filter as JSON string","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"description":"Fields to update on matching documents","content":{"application/json":{"schema":{"type":"object","description":"Update operations"}}}},"responses":{"200":{"description":"Documents updated successfully","content":{"application/json":{"schema":{"type":"object","properties":{"modifiedCount":{"type":"integer","description":"Number of documents modified"}}}}}},"400":{"description":"Invalid query or validation error"},"404":{"description":"Collection schema not found"}}},"delete":{"summary":"Batch delete todos","description":"Delete multiple todos documents matching a query","tags":["Todos"],"operationId":"deleteManyTodos","parameters":[{"name":"q","in":"query","description":"MongoDB-style query filter as JSON string","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Documents deleted successfully","content":{"application/json":{"schema":{"type":"object","properties":{"deletedCount":{"type":"integer","description":"Number of documents deleted"}}}}}},"400":{"description":"Invalid query"},"404":{"description":"Collection schema not found"}}}},"/api/todos/{ID}":{"get":{"summary":"Get todo by ID","description":"Retrieve a single todo by its unique identifier","tags":["Todos"],"operationId":"getTodo","parameters":[{"name":"ID","in":"path","required":true,"description":"Unique todo identifier","schema":{"type":"string"}}],"responses":{"200":{"description":"Todo found","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Todos"},{"type":"object","properties":{"_id":{"type":"string","description":"Unique document ID"}}}]}}}},"404":{"description":"Todo not found"}}},"put":{"summary":"Replace todo","description":"Replace an existing todo document entirely (validated against schema)","tags":["Todos"],"operationId":"replaceTodo","parameters":[{"name":"ID","in":"path","required":true,"description":"Unique todo identifier","schema":{"type":"string"}}],"requestBody":{"required":true,"description":"Complete todo data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Todos"}}}},"responses":{"200":{"description":"Todo replaced successfully","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Todos"},{"type":"object","properties":{"_id":{"type":"string","description":"Unique document ID"}}}]}}}},"400":{"description":"Validation error"},"404":{"description":"Todo not found"}}},"patch":{"summary":"Update todo","description":"Partially update an existing todo document","tags":["Todos"],"operationId":"updateTodo","parameters":[{"name":"ID","in":"path","required":true,"description":"Unique todo identifier","schema":{"type":"string"}}],"requestBody":{"required":true,"description":"Partial todo data to update","content":{"application/json":{"schema":{"type":"object","description":"Fields to update"}}}},"responses":{"200":{"description":"Todo updated successfully","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Todos"},{"type":"object","properties":{"_id":{"type":"string","description":"Unique document ID"}}}]}}}},"400":{"description":"Validation error"},"404":{"description":"Todo not found"}}},"delete":{"summary":"Delete todo","description":"Delete a todo by its unique identifier","tags":["Todos"],"operationId":"deleteTodo","parameters":[{"name":"ID","in":"path","required":true,"description":"Unique todo identifier","schema":{"type":"string"}}],"responses":{"200":{"description":"Todo deleted successfully","content":{"application/json":{"schema":{"type":"object","properties":{"_id":{"type":"string","description":"ID of deleted document"}}}}}},"404":{"description":"Todo not found"}}}}},"components":{"schemas":{"Todos":{"type":"object","properties":{"title":{"type":"string","minLength":1,"description":"Todo title"},"completed":{"type":"boolean","default":false,"description":"Completion status"}},"required":["title"]}},"securitySchemes":{"apiKey":{"type":"apiKey","in":"header","name":"x-apikey","description":"Codehooks API key for authentication"},"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"JWT Bearer token authentication"}}},"security":[{"apiKey":[]}],"tags":[{"name":"todos","description":"Todo operations"}]}