{"openapi":"3.0.0","info":{"title":"Yomio API","description":"Backend API for Yomio mobile app","version":"1.0.0"},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"schemas":{}},"paths":{"/api/shared/expense/{token}":{"get":{"summary":"Get shared expense by token","tags":["Shared"],"description":"Public endpoint to retrieve an expense by its share token (no authentication required)","parameters":[{"schema":{"type":"string"},"in":"path","name":"token","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"merchantName":{"type":"string"},"merchantNormalized":{"nullable":true,"type":"string"},"merchantAddress":{"nullable":true,"type":"string"},"paymentMethod":{"nullable":true,"type":"string"},"categoryCode":{"nullable":true,"type":"string"},"totalAmount":{"type":"number"},"currencyCode":{"type":"string"},"description":{"nullable":true,"type":"string"},"purchaseDate":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"transactionType":{"type":"string","enum":["EXPENSE","INCOME"]},"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"price":{"type":"number"},"quantity":{"type":"number"},"unit":{"nullable":true,"type":"string"},"categoryCode":{"nullable":true,"type":"string"}},"required":["id","name","price","quantity"],"additionalProperties":false}}},"required":["id","merchantName","totalAmount","currencyCode","purchaseDate","transactionType","items"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/auth/oauth/google":{"post":{"summary":"Authenticate user with Google OAuth","tags":["OAuth"],"description":"Exchange Google ID token for AWS Cognito tokens","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"idToken":{"type":"string"},"currency":{"type":"string"},"locale":{"type":"string"},"deviceBrand":{"type":"string"},"deviceModel":{"type":"string"},"user":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"photo":{"type":"string","format":"uri"},"familyName":{"type":"string"},"givenName":{"type":"string"}},"required":["id","name","email"]}},"required":["idToken","user"]}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"user":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"firstName":{"type":"string"},"lastName":{"type":"string"},"emailVerified":{"type":"boolean"},"currencyCode":{"type":"string"},"locale":{"type":"string"},"deviceBrand":{"type":"string"},"deviceModel":{"type":"string"},"analyticsConsent":{"type":"boolean"},"language":{"type":"string"},"hasFamilyGroup":{"type":"boolean"}},"required":["id","email"],"additionalProperties":false},"tokens":{"type":"object","properties":{"accessToken":{"type":"string"},"idToken":{"type":"string"},"refreshToken":{"type":"string"}},"required":["accessToken","idToken","refreshToken"],"additionalProperties":false},"isNewUser":{"type":"boolean"}},"required":["user","tokens"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/auth/oauth/apple":{"post":{"summary":"Authenticate user with Apple OAuth","tags":["OAuth"],"description":"Exchange Apple identity token for AWS Cognito tokens","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"identityToken":{"type":"string"},"authorizationCode":{"type":"string"},"currency":{"type":"string"},"locale":{"type":"string"},"deviceBrand":{"type":"string"},"deviceModel":{"type":"string"},"user":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"name":{"type":"string"},"familyName":{"type":"string"},"givenName":{"type":"string"}},"required":["id"]}},"required":["identityToken","authorizationCode"]}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"user":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"firstName":{"type":"string"},"lastName":{"type":"string"},"emailVerified":{"type":"boolean"},"currencyCode":{"type":"string"},"locale":{"type":"string"},"deviceBrand":{"type":"string"},"deviceModel":{"type":"string"},"analyticsConsent":{"type":"boolean"},"language":{"type":"string"},"hasFamilyGroup":{"type":"boolean"}},"required":["id","email"],"additionalProperties":false},"tokens":{"type":"object","properties":{"accessToken":{"type":"string"},"idToken":{"type":"string"},"refreshToken":{"type":"string"}},"required":["accessToken","idToken","refreshToken"],"additionalProperties":false},"isNewUser":{"type":"boolean"}},"required":["user","tokens"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/expenses/":{"get":{"summary":"Get all user expenses","tags":["Expenses"],"description":"Retrieve all expenses for the authenticated user with pagination and filtering","parameters":[{"schema":{"default":1,"type":"integer","minimum":1,"maximum":9007199254740991},"in":"query","name":"page","required":false},{"schema":{"default":20,"type":"integer","minimum":1,"maximum":100},"in":"query","name":"limit","required":false},{"schema":{"default":"purchaseDate","type":"string","enum":["purchaseDate","totalAmount","merchantName","createdAt"]},"in":"query","name":"sortBy","required":false},{"schema":{"default":"desc","type":"string","enum":["asc","desc"]},"in":"query","name":"sortOrder","required":false},{"schema":{"type":"string","minLength":1,"maxLength":100},"in":"query","name":"search","required":false},{"schema":{"type":"array","items":{"type":"string"}},"in":"query","name":"merchants","required":false},{"schema":{"type":"array","items":{"type":"string"}},"in":"query","name":"paymentMethods","required":false},{"schema":{"type":"array","items":{"type":"string"}},"in":"query","name":"persons","required":false},{"schema":{"type":"string","enum":["EXPENSE","INCOME"]},"in":"query","name":"transactionType","required":false},{"schema":{"type":"array","items":{"type":"string"}},"in":"query","name":"categories","required":false},{"schema":{"type":"string","maxLength":30},"in":"query","name":"accountId","required":false},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"expenses":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"merchantName":{"type":"string"},"merchantNormalized":{"type":"string"},"merchantAddress":{"type":"string"},"paymentMethod":{"type":"string"},"accountId":{"nullable":true,"type":"string"},"categoryCode":{"type":"string"},"totalAmount":{"type":"number"},"itemCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"currencyCode":{"type":"string"},"convertedAmount":{"type":"number"},"convertedCurrencyCode":{"type":"string"},"description":{"type":"string"},"cognitoUserId":{"type":"string"},"personName":{"type":"string"},"personColor":{"type":"string"},"receiptId":{"type":"string"},"purchaseDate":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"transactionType":{"type":"string","enum":["EXPENSE","INCOME"]}},"required":["id","merchantName","totalAmount","currencyCode","cognitoUserId","purchaseDate","createdAt","updatedAt"],"additionalProperties":false}},"pagination":{"type":"object","properties":{"page":{"type":"integer","minimum":1,"maximum":9007199254740991},"limit":{"type":"integer","minimum":1,"maximum":100},"total":{"type":"integer","minimum":0,"maximum":9007199254740991},"totalPages":{"type":"integer","minimum":0,"maximum":9007199254740991},"hasMore":{"type":"boolean"}},"required":["page","limit","total","totalPages","hasMore"],"additionalProperties":false}},"required":["expenses","pagination"],"additionalProperties":false}}}}}},"post":{"summary":"Create a new expense","tags":["Expenses"],"description":"Create a new expense record","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"merchantName":{"type":"string"},"merchantNormalized":{"type":"string"},"totalAmount":{"type":"number"},"currencyCode":{"default":"USD","type":"string"},"description":{"type":"string"},"purchaseDate":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"receiptId":{"type":"string"},"merchantAddress":{"type":"string"},"paymentMethod":{"type":"string"},"categoryCode":{"type":"string"},"transactionType":{"default":"EXPENSE","type":"string","enum":["EXPENSE","INCOME"]},"accountId":{"nullable":true,"type":"string"}},"required":["merchantName","totalAmount"]}}}},"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"merchantName":{"type":"string"},"merchantNormalized":{"type":"string"},"merchantAddress":{"type":"string"},"paymentMethod":{"type":"string"},"accountId":{"nullable":true,"type":"string"},"categoryCode":{"type":"string"},"totalAmount":{"type":"number"},"itemCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"currencyCode":{"type":"string"},"convertedAmount":{"type":"number"},"convertedCurrencyCode":{"type":"string"},"description":{"type":"string"},"cognitoUserId":{"type":"string"},"personName":{"type":"string"},"personColor":{"type":"string"},"receiptId":{"type":"string"},"purchaseDate":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"transactionType":{"type":"string","enum":["EXPENSE","INCOME"]}},"required":["id","merchantName","totalAmount","currencyCode","cognitoUserId","purchaseDate","createdAt","updatedAt"],"additionalProperties":false}}}}}}},"/api/expenses/{id}":{"get":{"summary":"Get expense by ID","tags":["Expenses"],"description":"Retrieve a specific expense by its ID","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"merchantName":{"type":"string"},"merchantNormalized":{"type":"string"},"merchantAddress":{"type":"string"},"paymentMethod":{"type":"string"},"accountId":{"nullable":true,"type":"string"},"categoryCode":{"type":"string"},"totalAmount":{"type":"number"},"itemCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"currencyCode":{"type":"string"},"convertedAmount":{"type":"number"},"convertedCurrencyCode":{"type":"string"},"description":{"type":"string"},"cognitoUserId":{"type":"string"},"personName":{"type":"string"},"personColor":{"type":"string"},"receiptId":{"type":"string"},"purchaseDate":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"transactionType":{"type":"string","enum":["EXPENSE","INCOME"]}},"required":["id","merchantName","totalAmount","currencyCode","cognitoUserId","purchaseDate","createdAt","updatedAt"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}},"put":{"summary":"Update expense","tags":["Expenses"],"description":"Update a expense by ID","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"merchantName":{"type":"string"},"merchantNormalized":{"nullable":true,"type":"string"},"totalAmount":{"type":"number"},"currencyCode":{"type":"string"},"description":{"type":"string"},"purchaseDate":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"merchantAddress":{"type":"string"},"paymentMethod":{"nullable":true,"type":"string"},"transactionType":{"type":"string","enum":["EXPENSE","INCOME"]},"accountId":{"nullable":true,"type":"string"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"merchantName":{"type":"string"},"merchantNormalized":{"type":"string"},"merchantAddress":{"type":"string"},"paymentMethod":{"type":"string"},"accountId":{"nullable":true,"type":"string"},"categoryCode":{"type":"string"},"totalAmount":{"type":"number"},"itemCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"currencyCode":{"type":"string"},"convertedAmount":{"type":"number"},"convertedCurrencyCode":{"type":"string"},"description":{"type":"string"},"cognitoUserId":{"type":"string"},"personName":{"type":"string"},"personColor":{"type":"string"},"receiptId":{"type":"string"},"purchaseDate":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"transactionType":{"type":"string","enum":["EXPENSE","INCOME"]}},"required":["id","merchantName","totalAmount","currencyCode","cognitoUserId","purchaseDate","createdAt","updatedAt"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}},"patch":{"summary":"Partially update expense","tags":["Expenses"],"description":"Partially update a expense by ID","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"merchantName":{"type":"string"},"merchantNormalized":{"nullable":true,"type":"string"},"totalAmount":{"type":"number"},"currencyCode":{"type":"string"},"description":{"type":"string"},"purchaseDate":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"merchantAddress":{"type":"string"},"paymentMethod":{"nullable":true,"type":"string"},"transactionType":{"type":"string","enum":["EXPENSE","INCOME"]},"accountId":{"nullable":true,"type":"string"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"merchantName":{"type":"string"},"merchantNormalized":{"type":"string"},"merchantAddress":{"type":"string"},"paymentMethod":{"type":"string"},"accountId":{"nullable":true,"type":"string"},"categoryCode":{"type":"string"},"totalAmount":{"type":"number"},"itemCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"currencyCode":{"type":"string"},"convertedAmount":{"type":"number"},"convertedCurrencyCode":{"type":"string"},"description":{"type":"string"},"cognitoUserId":{"type":"string"},"personName":{"type":"string"},"personColor":{"type":"string"},"receiptId":{"type":"string"},"purchaseDate":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"transactionType":{"type":"string","enum":["EXPENSE","INCOME"]}},"required":["id","merchantName","totalAmount","currencyCode","cognitoUserId","purchaseDate","createdAt","updatedAt"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}},"delete":{"summary":"Delete expense","tags":["Expenses"],"description":"Delete a expense by ID","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/expenses/{id}/ai-summary":{"post":{"summary":"Generate AI summary for expense","tags":["Expenses"],"description":"Generate AI-powered insights for a expense (requires premium subscription)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"language":{"default":"en","type":"string"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"expenseId":{"type":"string"},"summaryJson":{"type":"object","properties":{"expense_style":{"type":"string"},"expense_intent":{"type":"string"},"emotional_balance":{"type":"string"},"consumption_scenario":{"type":"string"},"notable_signals":{"type":"array","items":{"type":"string"}}},"required":["expense_style","expense_intent","emotional_balance","consumption_scenario","notable_signals"],"additionalProperties":false},"locale":{"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","expenseId","summaryJson","locale","createdAt","updatedAt"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/expenses/{id}/share":{"post":{"summary":"Share expense","tags":["Expenses"],"description":"Generate or retrieve existing share token for an expense","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"shareToken":{"type":"string"},"shareUrl":{"type":"string"}},"required":["shareToken","shareUrl"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}},"delete":{"summary":"Revoke expense sharing","tags":["Expenses"],"description":"Remove share token and disable public access","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"204":{"description":"Default Response","content":{"application/json":{"schema":{"type":"string","nullable":true,"enum":[null]}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/expenses/{id}/items":{"get":{"summary":"Get all items in a expense","tags":["Expense Items"],"description":"Retrieve all items associated with a specific expense","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"price":{"type":"number"},"quantity":{"type":"number"},"unit":{"nullable":true,"type":"string"},"unitPrice":{"nullable":true,"type":"number"},"discount":{"nullable":true,"type":"number"},"itemType":{"type":"string","enum":["product","discount"]},"categoryCode":{"type":"string"},"notes":{"nullable":true,"type":"string"},"barcode":{"nullable":true,"type":"string"}},"required":["id","name","price","quantity","categoryCode"],"additionalProperties":false}}},"required":["items"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}},"post":{"summary":"Add item to expense","tags":["Expense Items"],"description":"Add a new item to an existing expense","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"price":{"type":"number"},"quantity":{"type":"number"},"unit":{"nullable":true,"type":"string"},"unitPrice":{"nullable":true,"type":"number"},"discount":{"nullable":true,"type":"number"},"categoryCode":{"type":"string"},"notes":{"type":"string"}},"required":["name","price","quantity","categoryCode"]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"price":{"type":"number"},"quantity":{"type":"number"},"unit":{"nullable":true,"type":"string"},"unitPrice":{"nullable":true,"type":"number"},"discount":{"nullable":true,"type":"number"},"itemType":{"type":"string","enum":["product","discount"]},"categoryCode":{"type":"string"},"notes":{"nullable":true,"type":"string"},"barcode":{"nullable":true,"type":"string"}},"required":["id","name","price","quantity","categoryCode"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/expenses/{id}/items/{itemId}":{"put":{"summary":"Update expense item","tags":["Expense Items"],"description":"Update details of a specific item in a expense","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"price":{"type":"number"},"quantity":{"type":"number"},"unit":{"nullable":true,"type":"string"},"unitPrice":{"nullable":true,"type":"number"},"discount":{"nullable":true,"type":"number"},"categoryCode":{"type":"string"},"notes":{"nullable":true,"type":"string"},"barcode":{"nullable":true,"type":"string"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"itemId","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"price":{"type":"number"},"quantity":{"type":"number"},"unit":{"nullable":true,"type":"string"},"unitPrice":{"nullable":true,"type":"number"},"discount":{"nullable":true,"type":"number"},"itemType":{"type":"string","enum":["product","discount"]},"categoryCode":{"type":"string"},"notes":{"nullable":true,"type":"string"},"barcode":{"nullable":true,"type":"string"}},"required":["id","name","price","quantity","categoryCode"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}},"delete":{"summary":"Remove item from expense","tags":["Expense Items"],"description":"Remove a specific item from a expense","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"itemId","required":true}],"responses":{"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/expense-items/":{"get":{"summary":"Search expense items across all expenses","tags":["Expense Items"],"description":"Search and filter expense items with pagination, sorting, category filtering, date range, and text search","parameters":[{"schema":{"default":1,"type":"integer","minimum":1,"maximum":9007199254740991},"in":"query","name":"page","required":false},{"schema":{"default":20,"type":"integer","minimum":1,"maximum":100},"in":"query","name":"limit","required":false},{"schema":{"default":"purchaseDate","type":"string","enum":["name","price","purchaseDate","categoryCode"]},"in":"query","name":"sortBy","required":false},{"schema":{"default":"desc","type":"string","enum":["asc","desc"]},"in":"query","name":"sortOrder","required":false},{"schema":{"type":"string","minLength":1,"maxLength":100},"in":"query","name":"search","required":false},{"schema":{"type":"string","minLength":1,"maxLength":200},"in":"query","name":"exactName","required":false},{"schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"in":"query","name":"categories","required":false},{"schema":{"type":"string"},"in":"query","name":"dateFrom","required":false},{"schema":{"type":"string"},"in":"query","name":"dateTo","required":false},{"schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"in":"query","name":"merchants","required":false},{"schema":{"type":"string","enum":["EXPENSE","INCOME"]},"in":"query","name":"transactionType","required":false},{"schema":{"type":"string","minLength":3,"maxLength":3},"in":"query","name":"targetCurrency","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"price":{"type":"number"},"quantity":{"type":"number"},"unit":{"nullable":true,"type":"string"},"unitPrice":{"nullable":true,"type":"number"},"discount":{"nullable":true,"type":"number"},"itemType":{"type":"string","enum":["product","discount"]},"categoryCode":{"type":"string"},"notes":{"nullable":true,"type":"string"},"barcode":{"nullable":true,"type":"string"},"expenseId":{"type":"string"},"purchaseDate":{"type":"string"},"merchantName":{"type":"string"},"currencyCode":{"type":"string"},"convertedAmount":{"type":"number"},"convertedCurrencyCode":{"type":"string"}},"required":["id","name","price","quantity","categoryCode","expenseId","purchaseDate","merchantName","currencyCode"],"additionalProperties":false}},"pagination":{"type":"object","properties":{"page":{"type":"number"},"limit":{"type":"number"},"total":{"type":"number"},"totalPages":{"type":"number"},"hasMore":{"type":"boolean"}},"required":["page","limit","total","totalPages","hasMore"],"additionalProperties":false}},"required":["items","pagination"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/documents/":{"post":{"summary":"Upload and process document","tags":["Documents"],"description":"Upload a document image file for OCR data extraction. Quota validation is performed automatically based on user subscription status.","responses":{"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"413":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}},"get":{"summary":"List documents","tags":["Documents"],"description":"List all documents for the authenticated user with pagination","parameters":[{"schema":{"default":"1","type":"string"},"in":"query","name":"page","required":false},{"schema":{"default":"50","type":"string"},"in":"query","name":"limit","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"documents":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"originalName":{"type":"string"},"s3Key":{"type":"string"},"status":{"type":"string","enum":["UPLOADED","PROCESSING","PROCESSED","ERROR","REPROCESSING"]},"cognitoUserId":{"type":"string"},"documentType":{"type":"string","enum":["receipt","invoice","other"]},"expenseId":{"type":"string"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"confidenceInfo":{"type":"object","properties":{"status":{"type":"string","enum":["normal","requires_attention"]},"issues":{"type":"array","items":{"type":"string"}},"score":{"type":"number","minimum":0,"maximum":1},"validationWarnings":{"type":"array","items":{"type":"string","enum":["NO_TOTAL","NO_ITEMS","TOTAL_MISMATCH","ALL_ITEMS_UNCATEGORIZED","FUTURE_DATE","DATE_TOO_OLD"]}}},"required":["status","issues","score"],"additionalProperties":false},"errorCode":{"type":"string","enum":["OCR_FAILED","IMAGE_TOO_LARGE","EXPENSE_CONFLICT","PROCESSING_FAILED"]}},"required":["id","originalName","s3Key","status","cognitoUserId","createdAt","updatedAt"],"additionalProperties":false}},"pagination":{"type":"object","properties":{"page":{"type":"integer","minimum":1,"maximum":9007199254740991},"limit":{"type":"integer","minimum":1,"maximum":100},"total":{"type":"integer","minimum":0,"maximum":9007199254740991},"totalPages":{"type":"integer","minimum":0,"maximum":9007199254740991},"hasMore":{"type":"boolean"}},"required":["page","limit","total","totalPages","hasMore"],"additionalProperties":false}},"required":["documents","pagination"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/documents/{id}":{"get":{"summary":"Get document with signed URL","tags":["Documents"],"description":"Get document data with secure signed URL for file access","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"originalName":{"type":"string"},"s3Key":{"type":"string"},"status":{"type":"string","enum":["UPLOADED","PROCESSING","PROCESSED","ERROR","REPROCESSING"]},"cognitoUserId":{"type":"string"},"documentType":{"type":"string","enum":["receipt","invoice","other"]},"expenseId":{"type":"string"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"confidenceInfo":{"type":"object","properties":{"status":{"type":"string","enum":["normal","requires_attention"]},"issues":{"type":"array","items":{"type":"string"}},"score":{"type":"number","minimum":0,"maximum":1},"validationWarnings":{"type":"array","items":{"type":"string","enum":["NO_TOTAL","NO_ITEMS","TOTAL_MISMATCH","ALL_ITEMS_UNCATEGORIZED","FUTURE_DATE","DATE_TOO_OLD"]}}},"required":["status","issues","score"],"additionalProperties":false},"errorCode":{"type":"string","enum":["OCR_FAILED","IMAGE_TOO_LARGE","EXPENSE_CONFLICT","PROCESSING_FAILED"]},"signedUrl":{"type":"string","format":"uri"}},"required":["id","originalName","s3Key","status","cognitoUserId","createdAt","updatedAt"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}},"delete":{"summary":"Delete document file","tags":["Documents"],"description":"Delete uploaded document file and processing data","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/documents/{id}/warnings/{code}/dismiss":{"patch":{"summary":"Dismiss a validation warning","tags":["Documents"],"description":"Hide a validation warning (e.g. TOTAL_MISMATCH) for a document. Re-appears if the underlying issue recurs after a later edit.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string","enum":["NO_TOTAL","NO_ITEMS","TOTAL_MISMATCH","ALL_ITEMS_UNCATEGORIZED","FUTURE_DATE","DATE_TOO_OLD"]},"in":"path","name":"code","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"originalName":{"type":"string"},"s3Key":{"type":"string"},"status":{"type":"string","enum":["UPLOADED","PROCESSING","PROCESSED","ERROR","REPROCESSING"]},"cognitoUserId":{"type":"string"},"documentType":{"type":"string","enum":["receipt","invoice","other"]},"expenseId":{"type":"string"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"confidenceInfo":{"type":"object","properties":{"status":{"type":"string","enum":["normal","requires_attention"]},"issues":{"type":"array","items":{"type":"string"}},"score":{"type":"number","minimum":0,"maximum":1},"validationWarnings":{"type":"array","items":{"type":"string","enum":["NO_TOTAL","NO_ITEMS","TOTAL_MISMATCH","ALL_ITEMS_UNCATEGORIZED","FUTURE_DATE","DATE_TOO_OLD"]}}},"required":["status","issues","score"],"additionalProperties":false},"errorCode":{"type":"string","enum":["OCR_FAILED","IMAGE_TOO_LARGE","EXPENSE_CONFLICT","PROCESSING_FAILED"]},"signedUrl":{"type":"string","format":"uri"}},"required":["id","originalName","s3Key","status","cognitoUserId","createdAt","updatedAt"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/v2/documents/":{"post":{"summary":"Upload and process receipt (GPT-4o multimodal)","tags":["Documents v2"],"description":"Upload a receipt image for single-pass extraction via GPT-4o vision. Returns structured expense with pre-categorized items — no OCR, no separate categorization step.","responses":{"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"413":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}},"get":{"summary":"List documents","tags":["Documents v2"],"description":"List all documents for the authenticated user with pagination","parameters":[{"schema":{"default":"1","type":"string"},"in":"query","name":"page","required":false},{"schema":{"default":"50","type":"string"},"in":"query","name":"limit","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"documents":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"originalName":{"type":"string"},"s3Key":{"type":"string"},"status":{"type":"string","enum":["UPLOADED","PROCESSING","PROCESSED","ERROR","REPROCESSING"]},"cognitoUserId":{"type":"string"},"documentType":{"type":"string","enum":["receipt","invoice","other"]},"expenseId":{"type":"string"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"confidenceInfo":{"type":"object","properties":{"status":{"type":"string","enum":["normal","requires_attention"]},"issues":{"type":"array","items":{"type":"string"}},"score":{"type":"number","minimum":0,"maximum":1},"validationWarnings":{"type":"array","items":{"type":"string","enum":["NO_TOTAL","NO_ITEMS","TOTAL_MISMATCH","ALL_ITEMS_UNCATEGORIZED","FUTURE_DATE","DATE_TOO_OLD"]}}},"required":["status","issues","score"],"additionalProperties":false},"errorCode":{"type":"string","enum":["OCR_FAILED","IMAGE_TOO_LARGE","EXPENSE_CONFLICT","PROCESSING_FAILED"]}},"required":["id","originalName","s3Key","status","cognitoUserId","createdAt","updatedAt"],"additionalProperties":false}},"pagination":{"type":"object","properties":{"page":{"type":"integer","minimum":1,"maximum":9007199254740991},"limit":{"type":"integer","minimum":1,"maximum":100},"total":{"type":"integer","minimum":0,"maximum":9007199254740991},"totalPages":{"type":"integer","minimum":0,"maximum":9007199254740991},"hasMore":{"type":"boolean"}},"required":["page","limit","total","totalPages","hasMore"],"additionalProperties":false}},"required":["documents","pagination"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/v2/documents/{id}/reprocess":{"post":{"summary":"Reprocess a document","tags":["Documents v2"],"description":"Re-run receipt extraction on an existing document using the chosen pipeline and optionally override the document type. Does not count against upload quota.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"pipeline":{"type":"string","enum":["v1","v2"]},"documentType":{"type":"string","enum":["receipt","invoice","other"]},"timezone":{"type":"string"}},"required":["pipeline"]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/v3/documents/":{"post":{"summary":"Upload a document for asynchronous processing","tags":["Documents v3"],"responses":{"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"413":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/v3/documents/{id}/status":{"get":{"summary":"Get asynchronous document processing status","tags":["Documents v3"],"parameters":[{"schema":{"type":"string","minLength":1},"in":"path","name":"id","required":true}],"responses":{"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/quotas/":{"get":{"summary":"Get user quota status","tags":["Quotas"],"description":"Retrieve current quota information including usage limits and consumption. Subscription tier is determined automatically from user database.","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"uploadsUsed":{"type":"number","minimum":0},"uploadsLimit":{"type":"number","minimum":0},"extraUploads":{"type":"number","minimum":0},"feedbackBonusGranted":{"type":"boolean"},"tier":{"type":"string","enum":["FREE","PREMIUM"]},"currentPeriodStart":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"currentPeriodEnd":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"isFamilyQuota":{"type":"boolean"},"familyMembersCount":{"type":"integer","minimum":0,"exclusiveMinimum":true,"maximum":9007199254740991},"isBusinessQuota":{"type":"boolean"},"businessRole":{"type":"string","enum":["ADMIN","MEMBER"]},"hadPremium":{"type":"boolean"},"premiumExpiresAt":{"nullable":true,"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"subscriptionExpired":{"type":"boolean"}},"required":["uploadsUsed","uploadsLimit","tier"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/quotas/feedback-bonus":{"post":{"summary":"Grant feedback upload bonus","tags":["Quotas"],"description":"Grants +2 bonus uploads to the user (or their family) for leaving a store review. Only grants once per user.","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"granted":{"type":"boolean"},"extraUploads":{"type":"number"}},"required":["granted","extraUploads"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/stats/top-products":{"get":{"summary":"Get top 5 products with similar names merged","tags":["Statistics"],"description":"Get top 5 products with similar names merged (e.g., MANGO, MANGO FRESH -> MANGO)","parameters":[{"schema":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}]},"in":"query","name":"startDate","required":false},{"schema":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}]},"in":"query","name":"endDate","required":false},{"schema":{"type":"string"},"in":"query","name":"currency","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"products":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"cost":{"type":"number","minimum":0},"quantity":{"type":"number","minimum":0},"categoryCode":{"type":"string"}},"required":["id","name","cost","quantity"],"additionalProperties":false}},"currency":{"type":"object","properties":{"code":{"type":"string"},"name":{"type":"string"},"symbol":{"type":"string"}},"required":["code","name","symbol"],"additionalProperties":false}},"required":["products","currency"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/stats/category-breakdown":{"get":{"summary":"Get spending breakdown by category","tags":["Statistics"],"description":"Get spending breakdown by category with percentages","parameters":[{"schema":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}]},"in":"query","name":"startDate","required":false},{"schema":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}]},"in":"query","name":"endDate","required":false},{"schema":{"type":"string"},"in":"query","name":"currency","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"categories":{"type":"array","items":{"type":"object","properties":{"categoryCode":{"type":"string"},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"total":{"type":"number","minimum":0},"percentage":{"type":"number","minimum":0}},"required":["categoryCode","count","total","percentage"],"additionalProperties":false}},"totalAmount":{"type":"number","minimum":0},"currency":{"type":"object","properties":{"code":{"type":"string"},"name":{"type":"string"},"symbol":{"type":"string"}},"required":["code","name","symbol"],"additionalProperties":false}},"required":["categories","totalAmount","currency"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/stats/spending-trends":{"get":{"summary":"Get spending trends over time grouped by period","tags":["Statistics"],"description":"Get spending trends over time grouped by period (day/week/month). Always returns all periods in range with 0 spending for periods with no expenses.","parameters":[{"schema":{"type":"string","enum":["day","week","month","year"]},"in":"query","name":"period","required":true},{"schema":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}]},"in":"query","name":"startDate","required":false},{"schema":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}]},"in":"query","name":"endDate","required":false},{"schema":{"type":"string"},"in":"query","name":"category","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"period":{"type":"string"},"amount":{"type":"number","minimum":0},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["period","amount","count"],"additionalProperties":false}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/stats/merchants-breakdown":{"get":{"summary":"Get spending breakdown by merchant","tags":["Statistics"],"description":"Get spending breakdown by merchant with total spent, transaction count, and average amount","parameters":[{"schema":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}]},"in":"query","name":"startDate","required":false},{"schema":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}]},"in":"query","name":"endDate","required":false},{"schema":{"type":"string"},"in":"query","name":"currency","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"merchants":{"type":"array","items":{"type":"object","properties":{"merchantName":{"type":"string"},"totalSpent":{"type":"number","minimum":0},"transactionCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"averageAmount":{"type":"number","minimum":0},"lastPurchaseDate":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["merchantName","totalSpent","transactionCount","averageAmount","lastPurchaseDate"],"additionalProperties":false}}},"required":["merchants"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/stats/person-breakdown":{"get":{"summary":"Get spending breakdown by family member","tags":["Statistics"],"description":"Get spending breakdown by family member with total spent, transaction count, and average amount. Only returns data for family users.","parameters":[{"schema":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}]},"in":"query","name":"startDate","required":false},{"schema":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}]},"in":"query","name":"endDate","required":false},{"schema":{"type":"string"},"in":"query","name":"currency","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"members":{"type":"array","items":{"type":"object","properties":{"personName":{"type":"string"},"cognitoUserId":{"type":"string"},"avatarColor":{"type":"string"},"totalSpent":{"type":"number","minimum":0},"transactionCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"averageAmount":{"type":"number","minimum":0},"lastPurchaseDate":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["personName","cognitoUserId","totalSpent","transactionCount","averageAmount","lastPurchaseDate"],"additionalProperties":false}}},"required":["members"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/stats/payment-account-breakdown":{"get":{"summary":"Get spending breakdown by payment method and account","tags":["Statistics"],"description":"Returns spending grouped by payment method and account with total spent, transaction count, and average amount","parameters":[{"schema":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}]},"in":"query","name":"startDate","required":false},{"schema":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}]},"in":"query","name":"endDate","required":false},{"schema":{"type":"string"},"in":"query","name":"currency","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"paymentMethod":{"nullable":true,"type":"string"},"accountId":{"nullable":true,"type":"string"},"accountName":{"nullable":true,"type":"string"},"totalSpent":{"type":"number","minimum":0},"transactionCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"averageAmount":{"type":"number","minimum":0},"lastPurchaseDate":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["paymentMethod","accountId","accountName","totalSpent","transactionCount","averageAmount","lastPurchaseDate"],"additionalProperties":false}}},"required":["items"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/stats/balance":{"get":{"summary":"Get net balance (income minus expenses)","tags":["Statistics"],"description":"Returns total income, total expenses, net balance, and per-account income breakdown","parameters":[{"schema":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}]},"in":"query","name":"startDate","required":false},{"schema":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}]},"in":"query","name":"endDate","required":false},{"schema":{"type":"string"},"in":"query","name":"currency","required":false}],"responses":{"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/stats/income-trends":{"get":{"summary":"Get income trends over time","tags":["Statistics"],"description":"Income grouped by day, week or month over a date range","parameters":[{"schema":{"type":"string","enum":["day","week","month","year"]},"in":"query","name":"period","required":true},{"schema":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}]},"in":"query","name":"startDate","required":false},{"schema":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}]},"in":"query","name":"endDate","required":false},{"schema":{"type":"string"},"in":"query","name":"category","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"period":{"type":"string"},"amount":{"type":"number","minimum":0},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["period","amount","count"],"additionalProperties":false}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/family/groups/me":{"get":{"summary":"Get my family group","tags":["Family"],"description":"Get the authenticated user's family group with all members","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"nullable":true,"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"ownerId":{"type":"string"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"members":{"type":"array","items":{"type":"object","properties":{"familyGroupId":{"type":"string"},"cognitoUserId":{"type":"string"},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"role":{"type":"string","enum":["OWNER","MEMBER"]},"joinedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["familyGroupId","cognitoUserId","email","role","joinedAt"],"additionalProperties":false}}},"required":["id","name","ownerId","createdAt","updatedAt","members"],"additionalProperties":false}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/family/members/{memberId}":{"delete":{"summary":"Remove family member or leave","tags":["Family"],"description":"Remove a member from the family group. If memberId is self, this is \"leave family\". Otherwise requires OWNER role.","parameters":[{"schema":{"type":"string"},"in":"path","name":"memberId","required":true}],"responses":{"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/family/invitations":{"get":{"summary":"Get sent invitations","tags":["Family"],"description":"Get all invitations sent by the authenticated user","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"status":{"type":"string","enum":["PENDING","ACCEPTED","EXPIRED","REVOKED","DECLINED"]},"sentAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"inviteLink":{"type":"string","format":"uri"},"inviterEmail":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"inviterName":{"type":"string"},"familyName":{"type":"string"},"expiresAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["id","email","status","sentAt"],"additionalProperties":false}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}},"post":{"summary":"Send family invitation","tags":["Family"],"description":"Create and send a new family invitation via email","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"message":{"type":"string"}},"required":["email"]}}}},"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"status":{"type":"string","enum":["PENDING","ACCEPTED","EXPIRED","REVOKED","DECLINED"]},"sentAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"inviteLink":{"type":"string","format":"uri"},"inviterEmail":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"inviterName":{"type":"string"},"familyName":{"type":"string"},"expiresAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["id","email","status","sentAt"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/family/invitations/received":{"get":{"summary":"Get received invitations","tags":["Family"],"description":"Get all pending invitations sent to the authenticated user's email","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"status":{"type":"string","enum":["PENDING","ACCEPTED","EXPIRED","REVOKED","DECLINED"]},"sentAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"inviteLink":{"type":"string","format":"uri"},"inviterEmail":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"inviterName":{"type":"string"},"familyName":{"type":"string"},"expiresAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["id","email","status","sentAt"],"additionalProperties":false}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/family/invitations/{id}":{"put":{"summary":"Accept or decline invitation","tags":["Family"],"description":"Accept or decline a family invitation","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"action":{"type":"string","enum":["accept","decline"]}},"required":["action"]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"redirectUrl":{"type":"string","format":"uri"}},"required":["message"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}},"delete":{"summary":"Revoke invitation","tags":["Family"],"description":"Revoke an invitation (if sender) or decline (if recipient)","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/business/unsubscribe-report":{"get":{"summary":"Unsubscribe from scheduled Business reports","tags":["Business"],"description":"One-click unsubscribe link sent in scheduled report emails. Token-verified, no authentication required.","responses":{"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/business/groups/me":{"get":{"summary":"Get my business group","tags":["Business"],"description":"Get the authenticated user's business group with all members","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"nullable":true,"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"billingOwnerCognitoUserId":{"type":"string"},"purchasedSeats":{"type":"integer","minimum":1,"maximum":50},"seatsUsed":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"members":{"type":"array","items":{"type":"object","properties":{"businessGroupId":{"type":"string"},"cognitoUserId":{"type":"string"},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"role":{"type":"string","enum":["ADMIN","MEMBER"]},"joinedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"uploadLimit":{"nullable":true,"type":"integer","minimum":0,"maximum":9007199254740991},"uploadsUsed":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["businessGroupId","cognitoUserId","email","role","joinedAt"],"additionalProperties":false}}},"required":["id","name","billingOwnerCognitoUserId","purchasedSeats","seatsUsed","createdAt","updatedAt","members"],"additionalProperties":false}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/business/status":{"get":{"summary":"Get my business status","tags":["Business"],"description":"Get the authenticated user's business membership status","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"inBusiness":{"type":"boolean"},"isActive":{"type":"boolean"},"role":{"nullable":true,"type":"string","enum":["ADMIN","MEMBER"]},"isBillingOwner":{"type":"boolean"},"purchasedSeats":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"seatsUsed":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"businessGroupId":{"nullable":true,"type":"string"},"businessName":{"nullable":true,"type":"string"},"requireApproval":{"type":"boolean"},"reportFrequency":{"nullable":true,"type":"string","enum":["WEEKLY","MONTHLY"]}},"required":["inBusiness","isActive","role","isBillingOwner","purchasedSeats","seatsUsed","businessGroupId","businessName","requireApproval","reportFrequency"],"additionalProperties":false}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/business/members/{memberId}":{"delete":{"summary":"Remove business member or leave","tags":["Business"],"description":"Remove a member from the business group. If memberId is self, this is \"leave\". Otherwise requires ADMIN role.","parameters":[{"schema":{"type":"string"},"in":"path","name":"memberId","required":true}],"responses":{"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/business/members/{memberId}/role":{"patch":{"summary":"Change business member role","tags":["Business"],"description":"Change a member's role (ADMIN or MEMBER). Requires ADMIN role.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"role":{"type":"string","enum":["ADMIN","MEMBER"]}},"required":["role"]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"memberId","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"businessGroupId":{"type":"string"},"cognitoUserId":{"type":"string"},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"role":{"type":"string","enum":["ADMIN","MEMBER"]},"joinedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"uploadLimit":{"nullable":true,"type":"integer","minimum":0,"maximum":9007199254740991},"uploadsUsed":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["businessGroupId","cognitoUserId","email","role","joinedAt"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/business/members/{memberId}/quota":{"patch":{"summary":"Set business member upload limit","tags":["Business"],"description":"Set (or clear, with null) a Member's personal upload cap within the shared quota pool. Requires ADMIN role.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"uploadLimit":{"nullable":true,"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["uploadLimit"]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"memberId","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"businessGroupId":{"type":"string"},"cognitoUserId":{"type":"string"},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"role":{"type":"string","enum":["ADMIN","MEMBER"]},"joinedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"uploadLimit":{"nullable":true,"type":"integer","minimum":0,"maximum":9007199254740991},"uploadsUsed":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["businessGroupId","cognitoUserId","email","role","joinedAt"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/business/invitations":{"get":{"summary":"Get sent invitations","tags":["Business"],"description":"Get all invitations sent by the authenticated user","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"role":{"type":"string","enum":["ADMIN","MEMBER"]},"status":{"type":"string","enum":["PENDING","ACCEPTED","EXPIRED","REVOKED","DECLINED"]},"sentAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"inviteLink":{"type":"string","format":"uri"},"inviterEmail":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"inviterName":{"type":"string"},"businessName":{"type":"string"},"expiresAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["id","email","role","status","sentAt"],"additionalProperties":false}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}},"post":{"summary":"Send business invitation","tags":["Business"],"description":"Create and send a new business invitation via email. Admin-only, blocked at the purchased seat count.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"role":{"type":"string","enum":["ADMIN","MEMBER"]},"message":{"type":"string"}},"required":["email","role"]}}}},"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"role":{"type":"string","enum":["ADMIN","MEMBER"]},"status":{"type":"string","enum":["PENDING","ACCEPTED","EXPIRED","REVOKED","DECLINED"]},"sentAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"inviteLink":{"type":"string","format":"uri"},"inviterEmail":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"inviterName":{"type":"string"},"businessName":{"type":"string"},"expiresAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["id","email","role","status","sentAt"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/business/invitations/batch":{"post":{"summary":"Send batch business invitations","tags":["Business"],"description":"Send several invitations from one Admin screen. Invitations that would exceed the seat cap are rejected individually.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"invitations":{"minItems":1,"maxItems":50,"type":"array","items":{"type":"object","properties":{"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"role":{"type":"string","enum":["ADMIN","MEMBER"]},"message":{"type":"string"}},"required":["email","role"]}}},"required":["invitations"]}}}},"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"created":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"role":{"type":"string","enum":["ADMIN","MEMBER"]},"status":{"type":"string","enum":["PENDING","ACCEPTED","EXPIRED","REVOKED","DECLINED"]},"sentAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"inviteLink":{"type":"string","format":"uri"},"inviterEmail":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"inviterName":{"type":"string"},"businessName":{"type":"string"},"expiresAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["id","email","role","status","sentAt"],"additionalProperties":false}},"rejected":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string"},"reason":{"type":"string"}},"required":["email","reason"],"additionalProperties":false}}},"required":["created","rejected"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/business/invitations/received":{"get":{"summary":"Get received invitations","tags":["Business"],"description":"Get all pending invitations sent to the authenticated user's email","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"role":{"type":"string","enum":["ADMIN","MEMBER"]},"status":{"type":"string","enum":["PENDING","ACCEPTED","EXPIRED","REVOKED","DECLINED"]},"sentAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"inviteLink":{"type":"string","format":"uri"},"inviterEmail":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"inviterName":{"type":"string"},"businessName":{"type":"string"},"expiresAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["id","email","role","status","sentAt"],"additionalProperties":false}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/business/invitations/{id}":{"put":{"summary":"Accept or decline invitation","tags":["Business"],"description":"Accept or decline a business invitation","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"action":{"type":"string","enum":["accept","decline"]}},"required":["action"]}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"422":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}},"delete":{"summary":"Revoke invitation","tags":["Business"],"description":"Revoke an invitation sent by the authenticated user","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/business/checkout-session":{"post":{"summary":"Create Business checkout session","tags":["Business"],"description":"Creates a per-seat Stripe Checkout Session for a Business subscription. Requires authentication — the signed-in user becomes the billing owner.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"seats":{"type":"integer","minimum":1,"maximum":50},"billingPeriod":{"type":"string","enum":["monthly","yearly"]},"customerEmail":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"successUrl":{"type":"string","format":"uri"},"cancelUrl":{"type":"string","format":"uri"}},"required":["seats","billingPeriod","successUrl","cancelUrl"]}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"checkoutUrl":{"type":"string","format":"uri"}},"required":["checkoutUrl"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/business/scan-pack/checkout-session":{"post":{"summary":"Create Business scan pack checkout session","tags":["Business"],"description":"Creates a one-time Stripe Checkout Session for N 30-scan packs, topping up the shared quota pool. Admin-only.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"packs":{"type":"integer","minimum":1,"maximum":50},"customerEmail":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"successUrl":{"type":"string","format":"uri"},"cancelUrl":{"type":"string","format":"uri"}},"required":["packs","successUrl","cancelUrl"]}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"checkoutUrl":{"type":"string","format":"uri"}},"required":["checkoutUrl"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/business/seats/increase":{"post":{"summary":"Increase purchased Business seats","tags":["Business"],"description":"Self-serve increase of the purchased seat count for the caller's Business group. Billing-owner-only. The new count must be strictly greater than the current one and at most 50 — decreasing still requires contacting support in v1. Charges the prorated difference immediately via Stripe.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"seats":{"type":"integer","minimum":1,"maximum":50}},"required":["seats"]}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"inBusiness":{"type":"boolean"},"isActive":{"type":"boolean"},"role":{"nullable":true,"type":"string","enum":["ADMIN","MEMBER"]},"isBillingOwner":{"type":"boolean"},"purchasedSeats":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"seatsUsed":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"businessGroupId":{"nullable":true,"type":"string"},"businessName":{"nullable":true,"type":"string"},"requireApproval":{"type":"boolean"},"reportFrequency":{"nullable":true,"type":"string","enum":["WEEKLY","MONTHLY"]}},"required":["inBusiness","isActive","role","isBillingOwner","purchasedSeats","seatsUsed","businessGroupId","businessName","requireApproval","reportFrequency"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/business/billing-portal-session":{"post":{"summary":"Create a Stripe Billing Portal session","tags":["Business"],"description":"Creates a Stripe Billing Portal session so the billing owner can self-serve cancel the subscription, update payment method, or view invoices. Billing-owner-only.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"returnUrl":{"type":"string","format":"uri"}},"required":["returnUrl"]}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"portalUrl":{"type":"string","format":"uri"}},"required":["portalUrl"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/business/settings":{"patch":{"summary":"Update Business settings","tags":["Business"],"description":"Update approval-workflow and scheduled-report settings for the caller's Business group. Admin-only.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"requireApproval":{"type":"boolean"},"reportFrequency":{"nullable":true,"type":"string","enum":["WEEKLY","MONTHLY"]}}}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"inBusiness":{"type":"boolean"},"isActive":{"type":"boolean"},"role":{"nullable":true,"type":"string","enum":["ADMIN","MEMBER"]},"isBillingOwner":{"type":"boolean"},"purchasedSeats":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"seatsUsed":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"businessGroupId":{"nullable":true,"type":"string"},"businessName":{"nullable":true,"type":"string"},"requireApproval":{"type":"boolean"},"reportFrequency":{"nullable":true,"type":"string","enum":["WEEKLY","MONTHLY"]}},"required":["inBusiness","isActive","role","isBillingOwner","purchasedSeats","seatsUsed","businessGroupId","businessName","requireApproval","reportFrequency"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/business/expenses/pending":{"get":{"summary":"Get pending expense approvals","tags":["Business"],"description":"List Business Members' expenses awaiting approval. Admin-only.","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"merchantName":{"type":"string"},"totalAmount":{"type":"number"},"currencyCode":{"type":"string"},"purchaseDate":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"memberCognitoUserId":{"type":"string"},"memberName":{"type":"string"},"memberEmail":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}},"required":["id","merchantName","totalAmount","currencyCode","purchaseDate","memberCognitoUserId","memberName","memberEmail"],"additionalProperties":false}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/business/expenses/{expenseId}/approve":{"post":{"summary":"Approve a pending expense","tags":["Business"],"description":"Approve a Member's pending expense. Admin-only.","parameters":[{"schema":{"type":"string"},"in":"path","name":"expenseId","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string","enum":["PENDING","APPROVED","REJECTED"]}},"required":["id","status"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/business/expenses/{expenseId}/reject":{"post":{"summary":"Reject a pending expense","tags":["Business"],"description":"Reject a Member's pending expense, with an optional reason. Admin-only.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"reason":{"type":"string","maxLength":500}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"expenseId","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string","enum":["PENDING","APPROVED","REJECTED"]}},"required":["id","status"],"additionalProperties":false}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/users/merchants":{"get":{"summary":"Get unique merchant names","tags":["Users"],"description":"Get list of unique merchant names for the current user (for filter dropdown)","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"merchants":{"type":"array","items":{"type":"string"}}},"required":["merchants"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/users/":{"delete":{"summary":"Delete user account","tags":["Users"],"description":"Permanently delete the current user's account and all associated data","responses":{"204":{"description":"Default Response","content":{"application/json":{"schema":{"type":"string","nullable":true,"enum":[null]}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/users/terms-acceptance":{"post":{"summary":"Accept Terms of Service and Privacy Policy","tags":["Users"],"description":"Records that the authenticated user has accepted the current versions of the Terms of Service and Privacy Policy. Submitted versions must match the server's current versions.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"termsVersion":{"type":"string"},"privacyVersion":{"type":"string"},"ageThresholdApplied":{"anyOf":[{"type":"number","enum":[13]},{"type":"number","enum":[16]}]}},"required":["termsVersion","privacyVersion"]}}}},"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"acceptedAt":{"type":"string","format":"date-time"},"termsVersion":{"type":"string"},"privacyVersion":{"type":"string"}},"required":["acceptedAt","termsVersion","privacyVersion"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/users/terms-acceptance/status":{"get":{"summary":"Get terms acceptance status","tags":["Users"],"description":"Returns whether the authenticated user has accepted the current versions of the Terms of Service and Privacy Policy.","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"accepted":{"type":"boolean"},"latestAcceptedTermsVersion":{"nullable":true,"type":"string"},"latestAcceptedPrivacyVersion":{"nullable":true,"type":"string"},"lastAcceptedAt":{"nullable":true,"type":"string","format":"date-time"},"currentTermsVersion":{"type":"string"},"currentPrivacyVersion":{"type":"string"},"changes":{"type":"array","items":{"type":"string"}},"upToDate":{"type":"boolean"}},"required":["accepted","latestAcceptedTermsVersion","latestAcceptedPrivacyVersion","lastAcceptedAt","currentTermsVersion","currentPrivacyVersion","changes","upToDate"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/users/profile":{"get":{"summary":"Get user profile","tags":["Users"],"description":"Returns the current user's stored display name and avatar color.","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"cognitoUserId":{"type":"string"},"displayName":{"nullable":true,"type":"string"},"avatarColor":{"nullable":true,"type":"string"},"timezone":{"nullable":true,"type":"string"},"dateFormatPreference":{"type":"string","enum":["AUTO","DMY","MDY"]}},"required":["cognitoUserId","displayName","avatarColor","timezone","dateFormatPreference"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}},"patch":{"summary":"Update user profile","tags":["Users"],"description":"Updates the current user's display name and/or avatar color. Creates a profile record if one does not exist.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"displayName":{"nullable":true,"type":"string","maxLength":50},"avatarColor":{"nullable":true,"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"},"timezone":{"nullable":true,"type":"string","minLength":1,"maxLength":64},"dateFormatPreference":{"type":"string","enum":["AUTO","DMY","MDY"]}}}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"cognitoUserId":{"type":"string"},"displayName":{"nullable":true,"type":"string"},"avatarColor":{"nullable":true,"type":"string"},"timezone":{"nullable":true,"type":"string"},"dateFormatPreference":{"type":"string","enum":["AUTO","DMY","MDY"]}},"required":["cognitoUserId","displayName","avatarColor","timezone","dateFormatPreference"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/currencies":{"get":{"summary":"Get all currencies","tags":["Dictionary"],"description":"Retrieve all supported currencies with codes, names, and symbols","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"currencies":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"name":{"type":"string"},"symbol":{"type":"string"},"priority":{"type":"number"}},"required":["code","name","symbol"],"additionalProperties":false}}},"required":["currencies"],"additionalProperties":false}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/categories":{"get":{"summary":"Get all categories","tags":["Dictionary"],"description":"Retrieve all available expense categories (public endpoint)","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"categories":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"code":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"color":{"nullable":true,"type":"string"},"icon":{"nullable":true,"type":"string"},"isDefault":{"type":"boolean"},"sortOrder":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"parentCode":{"nullable":true,"type":"string"}},"required":["id","code","name","description"],"additionalProperties":false}}},"required":["categories"],"additionalProperties":false}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/user/categories/":{"get":{"summary":"Get user categories","tags":["User Categories"],"description":"Get personalized categories: system defaults (respecting enable/disable) + custom user categories","parameters":[{"schema":{"default":"false","type":"string","enum":["true","false"]},"in":"query","name":"includeDisabled","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"categories":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"code":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"color":{"nullable":true,"type":"string"},"icon":{"nullable":true,"type":"string"},"isDefault":{"type":"boolean"},"sortOrder":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"parentCode":{"nullable":true,"type":"string"},"isCustom":{"type":"boolean"},"isEnabled":{"type":"boolean"}},"required":["id","code","name","description","isCustom","isEnabled"],"additionalProperties":false}}},"required":["categories"],"additionalProperties":false}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}},"post":{"summary":"Create custom category","tags":["User Categories"],"description":"Create a new user-defined category with auto-generated code","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":50},"description":{"default":"","type":"string","maxLength":200},"color":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"},"icon":{"type":"string","maxLength":10}},"required":["name"]}}}},"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"code":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"color":{"nullable":true,"type":"string"},"icon":{"nullable":true,"type":"string"},"isDefault":{"type":"boolean"},"sortOrder":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"parentCode":{"nullable":true,"type":"string"},"isCustom":{"type":"boolean"},"isEnabled":{"type":"boolean"}},"required":["id","code","name","description","isCustom","isEnabled"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/user/categories/{code}":{"put":{"summary":"Update custom category","tags":["User Categories"],"description":"Update name, description, color, or icon of a user-created custom category","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":50},"description":{"type":"string","maxLength":200},"color":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"},"icon":{"type":"string","maxLength":10}},"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","minLength":1},"in":"path","name":"code","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"code":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"color":{"nullable":true,"type":"string"},"icon":{"nullable":true,"type":"string"},"isDefault":{"type":"boolean"},"sortOrder":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"parentCode":{"nullable":true,"type":"string"},"isCustom":{"type":"boolean"},"isEnabled":{"type":"boolean"}},"required":["id","code","name","description","isCustom","isEnabled"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}},"delete":{"summary":"Delete custom category","tags":["User Categories"],"description":"Soft-delete a user-created custom category. System defaults cannot be deleted.","parameters":[{"schema":{"type":"string","minLength":1},"in":"path","name":"code","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"deleted":{"type":"boolean"},"code":{"type":"string"}},"required":["deleted","code"],"additionalProperties":false}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/user/categories/reorder":{"patch":{"summary":"Reorder custom categories","tags":["User Categories"],"description":"Set the display order of custom categories by providing codes in desired order","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"codes":{"minItems":1,"type":"array","items":{"type":"string","minLength":1}}},"required":["codes"],"additionalProperties":false}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"reordered":{"type":"boolean"}},"required":["reordered"],"additionalProperties":false}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/user/categories/{code}/preference":{"patch":{"summary":"Toggle category enabled/disabled","tags":["User Categories"],"description":"Set whether a system default category is enabled or disabled for this user","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"isEnabled":{"type":"boolean"}},"required":["isEnabled"]}}}},"parameters":[{"schema":{"type":"string","minLength":1},"in":"path","name":"code","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"categoryCode":{"type":"string"},"isEnabled":{"type":"boolean"}},"required":["categoryCode","isEnabled"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/user/currencies/":{"get":{"summary":"Get user currencies","tags":["User Currencies"],"description":"Get all active currencies with per-user enabled/disabled state (used by currency pickers and the currency settings screen)","parameters":[{"schema":{"default":"false","type":"string","enum":["true","false"]},"in":"query","name":"includeDisabled","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"currencies":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"name":{"type":"string"},"symbol":{"type":"string"},"priority":{"type":"number"},"isEnabled":{"type":"boolean"}},"required":["code","name","symbol","isEnabled"],"additionalProperties":false}}},"required":["currencies"],"additionalProperties":false}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/user/currencies/{code}/preference":{"patch":{"summary":"Toggle currency enabled/disabled","tags":["User Currencies"],"description":"Set whether a currency is shown in this user's currency pickers","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"isEnabled":{"type":"boolean"}},"required":["isEnabled"]}}}},"parameters":[{"schema":{"type":"string","minLength":1},"in":"path","name":"code","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"currencyCode":{"type":"string"},"isEnabled":{"type":"boolean"}},"required":["currencyCode","isEnabled"],"additionalProperties":false}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/webhooks/revenuecat":{"post":{"summary":"Handle RevenueCat webhooks","tags":["Webhooks"],"description":"Receives and processes RevenueCat webhook events for subscription updates. Requires Bearer token in Authorization header configured in RevenueCat dashboard.","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false}}}}}}},"/webhooks/stripe":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/health":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/ping":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/config/{key}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"key","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/copilot/messages":{"post":{"summary":"Send a message to Copilot","tags":["Copilot"],"description":"Send a new message to the AI assistant. Creates a new conversation if conversationId is not provided.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"conversationId":{"type":"string","minLength":1},"message":{"type":"string","minLength":1,"maxLength":5000},"context":{"type":"object","properties":{"timeperiod":{"type":"string","enum":["this_month","last_month","custom"]},"filters":{"type":"object","properties":{"merchantIds":{"maxItems":50,"type":"array","items":{"type":"string","minLength":1}},"paymentMethods":{"maxItems":20,"type":"array","items":{"type":"string","minLength":1}},"categories":{"maxItems":50,"type":"array","items":{"type":"string","minLength":1}},"searchQuery":{"type":"string","maxLength":100}},"additionalProperties":false},"dateRange":{"type":"object","properties":{"from":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"to":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},"required":["from","to"]}},"required":["timeperiod","dateRange"],"additionalProperties":false},"expenseId":{"type":"string","minLength":1}},"required":["message"],"additionalProperties":false}}}},"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"conversationId":{"type":"string"},"messageId":{"type":"string"},"assistantMessageId":{"type":"string"},"content":{"type":"string"},"timestamp":{"type":"string"},"contextSummary":{"type":"object","properties":{"expenseCount":{"type":"number"},"totalAmount":{"type":"number"},"currencyCodes":{"type":"array","items":{"type":"string"}}},"required":["expenseCount","totalAmount","currencyCodes"],"additionalProperties":false},"modelUsed":{"type":"string"},"tokensUsed":{"type":"object","properties":{"prompt":{"type":"number"},"completion":{"type":"number"},"total":{"type":"number"}},"required":["prompt","completion","total"],"additionalProperties":false}},"required":["conversationId","messageId","assistantMessageId","content","timestamp","contextSummary","modelUsed","tokensUsed"],"additionalProperties":false}}}}}}},"/api/copilot/usage":{"get":{"summary":"Get token usage stats","tags":["Copilot"],"description":"Returns the current weekly token usage, limit, remaining tokens, and reset time.","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"used":{"type":"number"},"limit":{"type":"number"},"remaining":{"type":"number"},"resetsAt":{"type":"string"},"percentUsed":{"type":"number"}},"required":["used","limit","remaining","resetsAt","percentUsed"],"additionalProperties":false}}}}}}},"/api/copilot/conversations":{"get":{"summary":"List conversations","tags":["Copilot"],"description":"Fetch paginated list of user's copilot conversations","parameters":[{"schema":{"default":20,"type":"integer","minimum":1,"maximum":100},"in":"query","name":"limit","required":false},{"schema":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"offset","required":false},{"schema":{"default":"recent","type":"string","enum":["recent","oldest"]},"in":"query","name":"sortBy","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"conversations":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"messageCount":{"type":"number"},"previewText":{"nullable":true,"type":"string"},"contextSummary":{"type":"object","properties":{"timeperiod":{"type":"string"},"dateRange":{"type":"object","properties":{"from":{"type":"string"},"to":{"type":"string"}},"required":["from","to"],"additionalProperties":false},"expenseCount":{"type":"number"},"totalAmount":{"type":"number"},"appliedFilters":{"type":"array","items":{"type":"string"}},"expenseId":{"type":"string"}},"required":["timeperiod","dateRange","expenseCount","totalAmount","appliedFilters"],"additionalProperties":false}},"required":["id","createdAt","updatedAt","messageCount","previewText","contextSummary"],"additionalProperties":false}},"pagination":{"type":"object","properties":{"limit":{"type":"number"},"offset":{"type":"number"},"total":{"type":"number"},"hasMore":{"type":"boolean"}},"required":["limit","offset","total","hasMore"],"additionalProperties":false}},"required":["conversations","pagination"],"additionalProperties":false}}}}}}},"/api/copilot/conversations/{conversationId}/messages":{"get":{"summary":"Get conversation messages","tags":["Copilot"],"description":"Fetch paginated messages for a specific conversation","parameters":[{"schema":{"default":50,"type":"integer","minimum":1,"maximum":100},"in":"query","name":"limit","required":false},{"schema":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"offset","required":false},{"schema":{"type":"string","minLength":1},"in":"path","name":"conversationId","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"conversationId":{"type":"string"},"messages":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"conversationId":{"type":"string"},"role":{"type":"string","enum":["user","assistant"]},"content":{"type":"string"},"timestamp":{"type":"string"},"sequenceNumber":{"type":"number"},"contextSnapshot":{"nullable":true},"metadata":{"nullable":true}},"required":["id","conversationId","role","content","timestamp","sequenceNumber"],"additionalProperties":false}},"pagination":{"type":"object","properties":{"limit":{"type":"number"},"offset":{"type":"number"},"total":{"type":"number"},"hasMore":{"type":"boolean"}},"required":["limit","offset","total","hasMore"],"additionalProperties":false}},"required":["conversationId","messages","pagination"],"additionalProperties":false}}}}}}},"/api/copilot/conversations/{conversationId}":{"delete":{"summary":"Delete a conversation","tags":["Copilot"],"description":"Delete a conversation and all its messages","parameters":[{"schema":{"type":"string","minLength":1},"in":"path","name":"conversationId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/accounts/":{"get":{"summary":"List user accounts","tags":["Accounts"],"responses":{"200":{"description":"Default Response"}}},"post":{"summary":"Create a named account","tags":["Accounts"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100},"accountType":{"type":"string","enum":["CASH","CARD","BANK_ACCOUNT","OTHER"]},"isDefault":{"type":"boolean"},"initialBalance":{"type":"number"}},"required":["name"],"additionalProperties":false}}}},"responses":{"200":{"description":"Default Response"}}}},"/api/accounts/{id}":{"put":{"summary":"Update account name or default flag","tags":["Accounts"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100},"accountType":{"type":"string","enum":["CASH","CARD","BANK_ACCOUNT","OTHER"]},"isDefault":{"type":"boolean"},"initialBalance":{"type":"number"}},"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","format":"cuid","pattern":"^[cC][0-9a-z]{6,}$"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"summary":"Delete an account","tags":["Accounts"],"parameters":[{"schema":{"type":"string","format":"cuid","pattern":"^[cC][0-9a-z]{6,}$"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/accounts/reorder":{"patch":{"summary":"Reorder accounts","tags":["Accounts"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"minItems":1,"type":"array","items":{"type":"string","format":"cuid","pattern":"^[cC][0-9a-z]{6,}$"}}},"required":["ids"],"additionalProperties":false}}}},"responses":{"200":{"description":"Default Response"}}}},"/api/income/":{"get":{"summary":"List income records","tags":["Income"],"parameters":[{"schema":{"type":"integer","minimum":1,"maximum":9007199254740991},"in":"query","name":"page","required":false},{"schema":{"type":"integer","minimum":1,"maximum":100},"in":"query","name":"limit","required":false},{"schema":{"type":"string","enum":["asc","desc"]},"in":"query","name":"sortOrder","required":false},{"schema":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}]},"in":"query","name":"startDate","required":false},{"schema":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}]},"in":"query","name":"endDate","required":false},{"schema":{"type":"string","format":"cuid","pattern":"^[cC][0-9a-z]{6,}$"},"in":"query","name":"accountId","required":false},{"schema":{"type":"string","minLength":3,"maxLength":3,"pattern":"^[A-Z]{3}$"},"in":"query","name":"currencyCode","required":false}],"responses":{"200":{"description":"Default Response"}}},"post":{"summary":"Create income record","tags":["Income"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"sourceName":{"type":"string","minLength":1,"maxLength":255},"amount":{"type":"number","minimum":0,"exclusiveMinimum":true,"maximum":10000000},"currencyCode":{"type":"string","minLength":3,"maxLength":3,"pattern":"^[A-Z]{3}$"},"incomeDate":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"accountId":{"type":"string","format":"cuid","pattern":"^[cC][0-9a-z]{6,}$"},"notes":{"type":"string","maxLength":2000}},"required":["sourceName","amount"],"additionalProperties":false}}}},"responses":{"200":{"description":"Default Response"}}}},"/api/income/summary":{"get":{"summary":"Get income summary (total + count)","tags":["Income"],"parameters":[{"schema":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}]},"in":"query","name":"startDate","required":false},{"schema":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}]},"in":"query","name":"endDate","required":false}],"responses":{"200":{"description":"Default Response"}}}},"/api/income/{id}":{"get":{"summary":"Get income record","tags":["Income"],"parameters":[{"schema":{"type":"string","format":"cuid","pattern":"^[cC][0-9a-z]{6,}$"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"put":{"summary":"Update income record","tags":["Income"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"sourceName":{"type":"string","minLength":1,"maxLength":255},"amount":{"type":"number","minimum":0,"exclusiveMinimum":true,"maximum":10000000},"currencyCode":{"type":"string","minLength":3,"maxLength":3,"pattern":"^[A-Z]{3}$"},"incomeDate":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"accountId":{"nullable":true,"type":"string","format":"cuid","pattern":"^[cC][0-9a-z]{6,}$"},"notes":{"type":"string","maxLength":2000}},"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","format":"cuid","pattern":"^[cC][0-9a-z]{6,}$"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"patch":{"summary":"Partially update income record","tags":["Income"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"sourceName":{"type":"string","minLength":1,"maxLength":255},"amount":{"type":"number","minimum":0,"exclusiveMinimum":true,"maximum":10000000},"currencyCode":{"type":"string","minLength":3,"maxLength":3,"pattern":"^[A-Z]{3}$"},"incomeDate":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"accountId":{"nullable":true,"type":"string","format":"cuid","pattern":"^[cC][0-9a-z]{6,}$"},"notes":{"type":"string","maxLength":2000}},"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","format":"cuid","pattern":"^[cC][0-9a-z]{6,}$"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"summary":"Delete income record","tags":["Income"],"parameters":[{"schema":{"type":"string","format":"cuid","pattern":"^[cC][0-9a-z]{6,}$"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/transactions/":{"get":{"summary":"Get unified transaction log (expenses + incomes)","tags":["Log"],"parameters":[{"schema":{"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"expenseOffset","required":false},{"schema":{"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"incomeOffset","required":false},{"schema":{"type":"integer","minimum":1,"maximum":100},"in":"query","name":"limit","required":false},{"schema":{"type":"string","maxLength":255},"in":"query","name":"search","required":false},{"schema":{"type":"string","enum":["asc","desc"]},"in":"query","name":"sortOrder","required":false},{"schema":{"anyOf":[{"type":"array","items":{"type":"string","enum":["EXPENSE","INCOME"]}},{"type":"string","enum":["EXPENSE","INCOME"]}]},"in":"query","name":"types","required":false},{"schema":{"anyOf":[{"type":"array","items":{"type":"string","maxLength":255}},{"type":"string","maxLength":255}]},"in":"query","name":"merchants","required":false},{"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"string"}]},"in":"query","name":"persons","required":false},{"schema":{"type":"string","format":"cuid","pattern":"^[cC][0-9a-z]{6,}$"},"in":"query","name":"accountId","required":false},{"schema":{"type":"string","minLength":3,"maxLength":3,"pattern":"^[A-Z]{3}$"},"in":"query","name":"currencyCode","required":false},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false}],"responses":{"200":{"description":"Default Response"}}}},"/api/budgets/burndown":{"get":{"summary":"Get burndown chart data for a month","tags":["Budget"],"description":"Returns daily planned vs actual spending data for budget burndown visualization","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":12},"in":"query","name":"month","required":true},{"schema":{"type":"integer","minimum":2020,"maximum":2100},"in":"query","name":"year","required":true},{"schema":{"type":"number","minimum":0,"exclusiveMinimum":true},"in":"query","name":"budget","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/budgets/limit":{"get":{"summary":"Get persisted monthly budget limit","tags":["Budget"],"description":"Returns the user's saved monthly budget limit, or null if never set.","responses":{"200":{"description":"Default Response"}}},"put":{"summary":"Set persisted monthly budget limit","tags":["Budget"],"description":"Creates or updates the user's saved monthly budget limit.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"monthlyLimit":{"type":"number","minimum":0,"exclusiveMinimum":true},"currencyCode":{"type":"string","minLength":3,"maxLength":3,"pattern":"^[A-Z]{3}$"}},"required":["monthlyLimit","currencyCode"]}}}},"responses":{"200":{"description":"Default Response"}}},"delete":{"summary":"Delete persisted monthly budget limit","tags":["Budget"],"description":"Removes the user's saved monthly budget limit, if one exists.","responses":{"200":{"description":"Default Response"}}}},"/api/gamification/stats":{"get":{"summary":"Get gamification stats","tags":["Gamification"],"description":"Returns the current streak, XP points, level, and recent achievement summary for the authenticated user.","responses":{"200":{"description":"Default Response"}}}},"/api/gamification/achievements":{"get":{"summary":"Get all achievements","tags":["Gamification"],"description":"Returns the full achievement catalog with locked/unlocked status per achievement for the authenticated user.","responses":{"200":{"description":"Default Response"}}}},"/api/gamification/streak/freeze":{"post":{"summary":"Use a streak freeze","tags":["Gamification"],"description":"Consumes one streak freeze token to preserve the current streak through a missed day.","responses":{"200":{"description":"Default Response"}}}},"/api/gamification/events/stats-viewed":{"post":{"summary":"Record statistics screen view","tags":["Gamification"],"description":"Fires the STATS_VIEWED gamification event (fire-and-forget). Returns 204 immediately.","responses":{"200":{"description":"Default Response"}}}},"/api/gamification/events/app-opened":{"post":{"summary":"Record app opened","tags":["Gamification"],"description":"Fires the APP_OPENED gamification event to update the daily streak. Returns 204 immediately.","responses":{"200":{"description":"Default Response"}}}},"/api/notification-preferences/":{"get":{"summary":"Get notification preferences","tags":["Notifications"],"description":"Returns the user's push notification preferences. Defaults to all enabled if not yet customized.","responses":{"200":{"description":"Default Response"}}},"put":{"summary":"Update notification preferences","tags":["Notifications"],"description":"Partially update push notification preferences. Only specified fields are changed.","responses":{"200":{"description":"Default Response"}}}},"/api/push-tokens/":{"post":{"summary":"Register an Expo push token","tags":["Notifications"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"token":{"type":"string","minLength":16,"maxLength":512,"pattern":"^Expo(?:nent)?PushToken\\[[^\\r\\n]+\\]$"},"platform":{"type":"string","enum":["ios","android"]},"timezone":{"type":"string","minLength":1,"maxLength":64}},"required":["token","platform"]}}}},"responses":{"200":{"description":"Default Response"}}},"delete":{"summary":"Remove an Expo push token","tags":["Notifications"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"token":{"type":"string","minLength":16,"maxLength":512,"pattern":"^Expo(?:nent)?PushToken\\[[^\\r\\n]+\\]$"}},"required":["token"]}}}},"responses":{"200":{"description":"Default Response"}}}},"/api/reports/weekly":{"get":{"summary":"Get weekly spending report","tags":["Reports"],"description":"Returns a weekly spending summary. offset=0 is the current (in-progress) week, offset=1 is last completed week, 2 is the week before, etc.","parameters":[{"schema":{"default":1,"type":"integer","minimum":0,"maximum":52},"in":"query","name":"offset","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"weekStart":{"type":"string"},"weekEnd":{"type":"string"},"sections":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["hero"]},"data":{"type":"object","properties":{"weekTotal":{"type":"number"},"lastWeekTotal":{"type":"number"},"percentChange":{"nullable":true,"type":"number"},"currency":{"type":"string"}},"required":["weekTotal","lastWeekTotal","percentChange","currency"],"additionalProperties":false}},"required":["type","data"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["aiInsights"]},"data":{"type":"object","properties":{"insights":{"nullable":true,"type":"string"},"available":{"type":"boolean"}},"required":["insights","available"],"additionalProperties":false}},"required":["type","data"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["topCategories"]},"data":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"categoryCode":{"type":"string"},"total":{"type":"number"},"percentage":{"type":"number"}},"required":["categoryCode","total","percentage"],"additionalProperties":false}}},"required":["items"],"additionalProperties":false}},"required":["type","data"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["topMerchants"]},"data":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"merchantName":{"type":"string"},"total":{"type":"number"},"count":{"type":"number"}},"required":["merchantName","total","count"],"additionalProperties":false}}},"required":["items"],"additionalProperties":false}},"required":["type","data"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["mostExpensiveItem"]},"data":{"type":"object","properties":{"item":{"nullable":true,"type":"object","properties":{"name":{"type":"string"},"price":{"type":"number"},"merchantName":{"nullable":true,"type":"string"},"purchaseDate":{"type":"string"}},"required":["name","price","merchantName","purchaseDate"],"additionalProperties":false}},"required":["item"],"additionalProperties":false}},"required":["type","data"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["gamification"]},"data":{"type":"object","properties":{"weeklyXP":{"type":"number"},"currentStreak":{"type":"number"},"longestStreak":{"type":"number"},"level":{"type":"number"},"levelName":{"type":"string"}},"required":["weeklyXP","currentStreak","longestStreak","level","levelName"],"additionalProperties":false}},"required":["type","data"],"additionalProperties":false}]}}},"required":["weekStart","weekEnd","sections"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/reports/weekly/history":{"get":{"summary":"Get weekly report history list","tags":["Reports"],"description":"Returns a paginated list of all past weeks grouped by time period (Current Week, This Month, This Year, Earlier)","parameters":[{"schema":{"default":1,"type":"integer","minimum":1,"maximum":9007199254740991},"in":"query","name":"page","required":false},{"schema":{"default":10,"type":"integer","minimum":1,"maximum":50},"in":"query","name":"limit","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"groups":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string"},"items":{"type":"array","items":{"type":"object","properties":{"weekStart":{"type":"string"},"weekEnd":{"type":"string"},"offset":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"weekTotal":{"type":"number"},"percentChange":{"nullable":true,"type":"number"},"currency":{"type":"string"}},"required":["weekStart","weekEnd","offset","weekTotal","percentChange","currency"],"additionalProperties":false}}},"required":["title","items"],"additionalProperties":false}},"page":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"hasMore":{"type":"boolean"}},"required":["groups","page","hasMore"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/subscriptions/sync":{"post":{"summary":"Sync subscription from RevenueCat","tags":["Subscriptions"],"description":"Reconciles subscription status between RevenueCat and the local database. Used after login to catch web billing purchases that were not propagated via webhook.","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"tier":{"type":"string","enum":["FREE","PREMIUM"]},"synced":{"type":"boolean","description":"True if a tier change was applied"}},"required":["tier","synced"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/recurring-payments/":{"get":{"summary":"List recurring payments","tags":["RecurringPayments"],"parameters":[{"schema":{"type":"string","enum":["ACTIVE","PAUSED","COMPLETED","CANCELLED"]},"in":"query","name":"status","required":false}],"responses":{"200":{"description":"Default Response"}}},"post":{"summary":"Create recurring payment","tags":["RecurringPayments"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"transactionType":{"type":"string","enum":["EXPENSE","INCOME"]},"merchantName":{"type":"string","minLength":1,"maxLength":200},"amount":{"type":"number","minimum":0,"exclusiveMinimum":true},"currencyCode":{"type":"string","minLength":3,"maxLength":3},"categoryCode":{"nullable":true,"type":"string"},"accountId":{"nullable":true,"type":"string","format":"cuid","pattern":"^[cC][0-9a-z]{6,}$"},"notes":{"nullable":true,"type":"string","maxLength":2000},"frequency":{"type":"string","enum":["DAILY","WEEKLY","BIWEEKLY","MONTHLY","YEARLY","CUSTOM"]},"intervalCount":{"type":"integer","minimum":0,"exclusiveMinimum":true,"maximum":365},"intervalUnit":{"type":"string","enum":["DAY","WEEK","MONTH","YEAR"]},"startDate":{"type":"string"},"endDate":{"nullable":true,"type":"string"},"maxOccurrences":{"nullable":true,"type":"integer","minimum":0,"exclusiveMinimum":true,"maximum":10000}},"required":["merchantName","amount","frequency","startDate"],"additionalProperties":false}}}},"responses":{"200":{"description":"Default Response"}}}},"/api/recurring-payments/{id}":{"get":{"summary":"Get recurring payment by ID","tags":["RecurringPayments"],"parameters":[{"schema":{"type":"string","format":"cuid","pattern":"^[cC][0-9a-z]{6,}$"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"patch":{"summary":"Update recurring payment","tags":["RecurringPayments"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"merchantName":{"type":"string","minLength":1,"maxLength":200},"amount":{"type":"number","minimum":0,"exclusiveMinimum":true},"currencyCode":{"type":"string","minLength":3,"maxLength":3},"categoryCode":{"nullable":true,"type":"string"},"accountId":{"nullable":true,"type":"string","format":"cuid","pattern":"^[cC][0-9a-z]{6,}$"},"notes":{"nullable":true,"type":"string","maxLength":2000},"frequency":{"type":"string","enum":["DAILY","WEEKLY","BIWEEKLY","MONTHLY","YEARLY","CUSTOM"]},"intervalCount":{"type":"integer","minimum":0,"exclusiveMinimum":true,"maximum":365},"intervalUnit":{"type":"string","enum":["DAY","WEEK","MONTH","YEAR"]},"endDate":{"nullable":true,"type":"string"},"nextDueDate":{"type":"string"},"maxOccurrences":{"nullable":true,"type":"integer","minimum":0,"exclusiveMinimum":true,"maximum":10000}},"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","format":"cuid","pattern":"^[cC][0-9a-z]{6,}$"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"summary":"Delete recurring payment","tags":["RecurringPayments"],"parameters":[{"schema":{"type":"string","format":"cuid","pattern":"^[cC][0-9a-z]{6,}$"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/recurring-payments/{id}/pause":{"post":{"summary":"Pause recurring payment","tags":["RecurringPayments"],"parameters":[{"schema":{"type":"string","format":"cuid","pattern":"^[cC][0-9a-z]{6,}$"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/recurring-payments/{id}/resume":{"post":{"summary":"Resume recurring payment","tags":["RecurringPayments"],"parameters":[{"schema":{"type":"string","format":"cuid","pattern":"^[cC][0-9a-z]{6,}$"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/products/insights/":{"get":{"summary":"Get product price insights","tags":["Products"],"description":"Returns price stats, store comparison, and price history for a product","parameters":[{"schema":{"type":"string","minLength":1},"in":"query","name":"productName","required":true},{"schema":{"type":"string"},"in":"query","name":"categoryCode","required":false},{"schema":{"type":"string","minLength":3,"maxLength":3},"in":"query","name":"targetCurrency","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"canonicalName":{"type":"string"},"categoryCode":{"nullable":true,"type":"string"},"currency":{"type":"string"},"priceStats":{"type":"object","properties":{"avgPrice":{"type":"number"},"minPrice":{"type":"number"},"maxPrice":{"type":"number"},"totalSpent":{"type":"number"},"timesBought":{"type":"number"}},"required":["avgPrice","minPrice","maxPrice","totalSpent","timesBought"],"additionalProperties":false},"merchants":{"type":"array","items":{"type":"object","properties":{"merchantName":{"type":"string"},"avgPrice":{"type":"number"},"minPrice":{"type":"number"},"maxPrice":{"type":"number"},"count":{"type":"number"},"lastPurchaseDate":{"type":"string"}},"required":["merchantName","avgPrice","minPrice","maxPrice","count","lastPurchaseDate"],"additionalProperties":false}},"priceHistory":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string"},"price":{"type":"number"},"merchantName":{"type":"string"},"purchaseId":{"type":"string"}},"required":["date","price","merchantName","purchaseId"],"additionalProperties":false}}},"required":["canonicalName","categoryCode","currency","priceStats","merchants","priceHistory"],"additionalProperties":false}}}}}}},"/api/inventory/":{"get":{"summary":"List inventory items","tags":["Inventory"],"parameters":[{"schema":{"default":1,"type":"integer","minimum":1,"maximum":9007199254740991},"in":"query","name":"page","required":false},{"schema":{"default":25,"type":"integer","minimum":1,"maximum":100},"in":"query","name":"limit","required":false},{"schema":{"type":"string"},"in":"query","name":"search","required":false},{"schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"in":"query","name":"categories","required":false},{"schema":{"type":"string","enum":["CONSUMABLE","DURABLE"]},"in":"query","name":"inventoryType","required":false},{"schema":{"type":"string"},"in":"query","name":"location","required":false},{"schema":{"type":"boolean"},"in":"query","name":"lowStock","required":false},{"schema":{"type":"integer","minimum":1,"maximum":365},"in":"query","name":"expiringWithinDays","required":false},{"schema":{"default":"updatedAt","type":"string","enum":["name","expiresAt","currentQty","updatedAt"]},"in":"query","name":"sortBy","required":false},{"schema":{"default":"desc","type":"string","enum":["asc","desc"]},"in":"query","name":"sortOrder","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"categoryCode":{"nullable":true,"type":"string"},"inventoryType":{"type":"string","enum":["CONSUMABLE","DURABLE"]},"currentQty":{"type":"number"},"unit":{"nullable":true,"type":"string"},"location":{"nullable":true,"type":"string"},"expiresAt":{"nullable":true,"type":"string"},"minQty":{"nullable":true,"type":"number"},"barcode":{"nullable":true,"type":"string"},"notes":{"nullable":true,"type":"string"},"purchaseDate":{"nullable":true,"type":"string"},"purchaseId":{"nullable":true,"type":"string"},"warrantyExpiresAt":{"nullable":true,"type":"string"},"attachmentUrl":{"nullable":true,"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","name","categoryCode","inventoryType","currentQty","unit","location","expiresAt","minQty","barcode","notes","purchaseDate","purchaseId","warrantyExpiresAt","attachmentUrl","createdAt","updatedAt"],"additionalProperties":false}},"pagination":{"type":"object","properties":{"page":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"limit":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"total":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"totalPages":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["page","limit","total","totalPages"],"additionalProperties":false}},"required":["items","pagination"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}},"post":{"summary":"Create inventory item","tags":["Inventory"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"categoryCode":{"type":"string"},"inventoryType":{"default":"CONSUMABLE","type":"string","enum":["CONSUMABLE","DURABLE"]},"currentQty":{"default":0,"type":"number","minimum":0},"unit":{"type":"string","enum":["unit","kg","g","lb","oz","l","ml"]},"location":{"type":"string","maxLength":100},"expiresAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"minQty":{"type":"number","minimum":0},"barcode":{"type":"string","maxLength":50},"notes":{"type":"string","maxLength":500},"purchaseDate":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"purchaseId":{"type":"string"},"warrantyExpiresAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["name"]}}}},"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"categoryCode":{"nullable":true,"type":"string"},"inventoryType":{"type":"string","enum":["CONSUMABLE","DURABLE"]},"currentQty":{"type":"number"},"unit":{"nullable":true,"type":"string"},"location":{"nullable":true,"type":"string"},"expiresAt":{"nullable":true,"type":"string"},"minQty":{"nullable":true,"type":"number"},"barcode":{"nullable":true,"type":"string"},"notes":{"nullable":true,"type":"string"},"purchaseDate":{"nullable":true,"type":"string"},"purchaseId":{"nullable":true,"type":"string"},"warrantyExpiresAt":{"nullable":true,"type":"string"},"attachmentUrl":{"nullable":true,"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","name","categoryCode","inventoryType","currentQty","unit","location","expiresAt","minQty","barcode","notes","purchaseDate","purchaseId","warrantyExpiresAt","attachmentUrl","createdAt","updatedAt"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/inventory/locations":{"get":{"summary":"Get distinct inventory locations","tags":["Inventory"],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"locations":{"type":"array","items":{"type":"string"}}},"required":["locations"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/inventory/locations/{name}":{"put":{"summary":"Rename inventory location","tags":["Inventory"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"newName":{"type":"string","minLength":1,"maxLength":100}},"required":["newName"]}}}},"parameters":[{"schema":{"type":"string","minLength":1},"in":"path","name":"name","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"updated":{"type":"number"}},"required":["updated"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}},"delete":{"summary":"Delete inventory location","tags":["Inventory"],"parameters":[{"schema":{"type":"string","minLength":1},"in":"path","name":"name","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"cleared":{"type":"number"}},"required":["cleared"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/inventory/{id}":{"get":{"summary":"Get inventory item by ID","tags":["Inventory"],"parameters":[{"schema":{"type":"string","minLength":1},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"categoryCode":{"nullable":true,"type":"string"},"inventoryType":{"type":"string","enum":["CONSUMABLE","DURABLE"]},"currentQty":{"type":"number"},"unit":{"nullable":true,"type":"string"},"location":{"nullable":true,"type":"string"},"expiresAt":{"nullable":true,"type":"string"},"minQty":{"nullable":true,"type":"number"},"barcode":{"nullable":true,"type":"string"},"notes":{"nullable":true,"type":"string"},"purchaseDate":{"nullable":true,"type":"string"},"purchaseId":{"nullable":true,"type":"string"},"warrantyExpiresAt":{"nullable":true,"type":"string"},"attachmentUrl":{"nullable":true,"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","name","categoryCode","inventoryType","currentQty","unit","location","expiresAt","minQty","barcode","notes","purchaseDate","purchaseId","warrantyExpiresAt","attachmentUrl","createdAt","updatedAt"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}},"put":{"summary":"Update inventory item","tags":["Inventory"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"categoryCode":{"nullable":true,"type":"string"},"inventoryType":{"type":"string","enum":["CONSUMABLE","DURABLE"]},"currentQty":{"type":"number","minimum":0},"unit":{"nullable":true,"type":"string","enum":["unit","kg","g","lb","oz","l","ml"]},"location":{"nullable":true,"type":"string","maxLength":100},"expiresAt":{"nullable":true,"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"minQty":{"nullable":true,"type":"number","minimum":0},"barcode":{"nullable":true,"type":"string","maxLength":50},"notes":{"nullable":true,"type":"string","maxLength":500},"purchaseDate":{"nullable":true,"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"purchaseId":{"nullable":true,"type":"string"},"warrantyExpiresAt":{"nullable":true,"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","minLength":1},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"categoryCode":{"nullable":true,"type":"string"},"inventoryType":{"type":"string","enum":["CONSUMABLE","DURABLE"]},"currentQty":{"type":"number"},"unit":{"nullable":true,"type":"string"},"location":{"nullable":true,"type":"string"},"expiresAt":{"nullable":true,"type":"string"},"minQty":{"nullable":true,"type":"number"},"barcode":{"nullable":true,"type":"string"},"notes":{"nullable":true,"type":"string"},"purchaseDate":{"nullable":true,"type":"string"},"purchaseId":{"nullable":true,"type":"string"},"warrantyExpiresAt":{"nullable":true,"type":"string"},"attachmentUrl":{"nullable":true,"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","name","categoryCode","inventoryType","currentQty","unit","location","expiresAt","minQty","barcode","notes","purchaseDate","purchaseId","warrantyExpiresAt","attachmentUrl","createdAt","updatedAt"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}},"delete":{"summary":"Delete inventory item","tags":["Inventory"],"parameters":[{"schema":{"type":"string","minLength":1},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"deleted":{"type":"boolean"},"id":{"type":"string"}},"required":["deleted","id"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/inventory/bulk":{"patch":{"summary":"Bulk update inventory items","tags":["Inventory"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"string","minLength":1}},"patch":{"type":"object","properties":{"location":{"nullable":true,"type":"string","maxLength":100},"expiresAt":{"nullable":true,"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"currentQty":{"type":"number","minimum":0}}}},"required":["ids","patch"]}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"updated":{"type":"number"}},"required":["updated"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}},"delete":{"summary":"Bulk delete inventory items","tags":["Inventory"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"string","minLength":1}}},"required":["ids"]}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"deleted":{"type":"number"}},"required":["deleted"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/inventory/populate":{"post":{"summary":"Populate inventory from purchases","tags":["Inventory"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"items":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"categoryCode":{"type":"string"},"unit":{"type":"string","enum":["unit","kg","g","lb","oz","l","ml"]},"quantity":{"type":"number","minimum":0},"purchaseDate":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"purchaseId":{"type":"string"}},"required":["name","quantity"]}}},"required":["items"]}}}},"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"created":{"type":"number"}},"required":["created"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/inventory/populate-smart":{"post":{"summary":"Smart populate with duplicate detection","tags":["Inventory"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"items":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"categoryCode":{"type":"string"},"unit":{"type":"string","enum":["unit","kg","g","lb","oz","l","ml"]},"quantity":{"type":"number","minimum":0},"purchaseDate":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"purchaseId":{"type":"string"}},"required":["name","quantity"]}}},"required":["items"]}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"created":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"categoryCode":{"nullable":true,"type":"string"},"inventoryType":{"type":"string","enum":["CONSUMABLE","DURABLE"]},"currentQty":{"type":"number"},"unit":{"nullable":true,"type":"string"},"location":{"nullable":true,"type":"string"},"expiresAt":{"nullable":true,"type":"string"},"minQty":{"nullable":true,"type":"number"},"barcode":{"nullable":true,"type":"string"},"notes":{"nullable":true,"type":"string"},"purchaseDate":{"nullable":true,"type":"string"},"purchaseId":{"nullable":true,"type":"string"},"warrantyExpiresAt":{"nullable":true,"type":"string"},"attachmentUrl":{"nullable":true,"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","name","categoryCode","inventoryType","currentQty","unit","location","expiresAt","minQty","barcode","notes","purchaseDate","purchaseId","warrantyExpiresAt","attachmentUrl","createdAt","updatedAt"],"additionalProperties":false}},"duplicates":{"type":"array","items":{"type":"object","properties":{"existing":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"categoryCode":{"nullable":true,"type":"string"},"inventoryType":{"type":"string","enum":["CONSUMABLE","DURABLE"]},"currentQty":{"type":"number"},"unit":{"nullable":true,"type":"string"},"location":{"nullable":true,"type":"string"},"expiresAt":{"nullable":true,"type":"string"},"minQty":{"nullable":true,"type":"number"},"barcode":{"nullable":true,"type":"string"},"notes":{"nullable":true,"type":"string"},"purchaseDate":{"nullable":true,"type":"string"},"purchaseId":{"nullable":true,"type":"string"},"warrantyExpiresAt":{"nullable":true,"type":"string"},"attachmentUrl":{"nullable":true,"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","name","categoryCode","inventoryType","currentQty","unit","location","expiresAt","minQty","barcode","notes","purchaseDate","purchaseId","warrantyExpiresAt","attachmentUrl","createdAt","updatedAt"],"additionalProperties":false},"incoming":{"type":"object","properties":{"name":{"type":"string"},"categoryCode":{"type":"string"},"unit":{"type":"string"},"quantity":{"type":"number"},"purchaseDate":{"type":"string"},"purchaseId":{"type":"string"}},"required":["name","quantity"],"additionalProperties":false}},"required":["existing","incoming"],"additionalProperties":false}}},"required":["created","duplicates"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/inventory/resolve-duplicates":{"post":{"summary":"Resolve duplicate inventory items","tags":["Inventory"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"resolutions":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"object","properties":{"existingId":{"type":"string","minLength":1},"incoming":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"categoryCode":{"type":"string"},"unit":{"type":"string","enum":["unit","kg","g","lb","oz","l","ml"]},"quantity":{"type":"number","minimum":0},"purchaseDate":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"purchaseId":{"type":"string"}},"required":["name","quantity"]},"resolution":{"type":"string","enum":["replace","add","skip"]}},"required":["existingId","incoming","resolution"]}}},"required":["resolutions"]}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"updated":{"type":"number"},"created":{"type":"number"}},"required":["updated","created"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/inventory/{id}/attachment":{"post":{"summary":"Upload attachment for inventory item","tags":["Inventory"],"parameters":[{"schema":{"type":"string","minLength":1},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"categoryCode":{"nullable":true,"type":"string"},"inventoryType":{"type":"string","enum":["CONSUMABLE","DURABLE"]},"currentQty":{"type":"number"},"unit":{"nullable":true,"type":"string"},"location":{"nullable":true,"type":"string"},"expiresAt":{"nullable":true,"type":"string"},"minQty":{"nullable":true,"type":"number"},"barcode":{"nullable":true,"type":"string"},"notes":{"nullable":true,"type":"string"},"purchaseDate":{"nullable":true,"type":"string"},"purchaseId":{"nullable":true,"type":"string"},"warrantyExpiresAt":{"nullable":true,"type":"string"},"attachmentUrl":{"nullable":true,"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","name","categoryCode","inventoryType","currentQty","unit","location","expiresAt","minQty","barcode","notes","purchaseDate","purchaseId","warrantyExpiresAt","attachmentUrl","createdAt","updatedAt"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/shopping-list/":{"get":{"responses":{"200":{"description":"Default Response"}}},"post":{"responses":{"200":{"description":"Default Response"}}}},"/api/shopping-list/{id}":{"patch":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/shopping-list/checked":{"delete":{"responses":{"200":{"description":"Default Response"}}}},"/api/shopping-list/from-inventory":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/api/email-receipts/personal/address":{"get":{"summary":"Get or lazily create the personal forwarding address","tags":["EmailReceipts"],"responses":{"200":{"description":"Default Response"}}}},"/api/email-receipts/personal/address/rotate":{"post":{"summary":"Rotate the personal forwarding address","tags":["EmailReceipts"],"responses":{"200":{"description":"Default Response"}}}},"/api/email-receipts/personal/allowlist":{"get":{"summary":"List the personal sender allowlist","tags":["EmailReceipts"],"responses":{"200":{"description":"Default Response"}}},"post":{"summary":"Add a sender to the personal allowlist","tags":["EmailReceipts"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"senderEmail":{"type":"string","maxLength":320,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}},"required":["senderEmail"],"additionalProperties":false}}}},"responses":{"200":{"description":"Default Response"}}}},"/api/email-receipts/personal/allowlist/{id}":{"delete":{"summary":"Remove a sender from the personal allowlist","tags":["EmailReceipts"],"parameters":[{"schema":{"type":"string","format":"cuid","pattern":"^[cC][0-9a-z]{6,}$"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/email-receipts/personal/review-queue":{"get":{"summary":"List personal review queue items","tags":["EmailReceipts"],"responses":{"200":{"description":"Default Response"}}}},"/api/email-receipts/personal/review-queue/{id}/approve":{"post":{"summary":"Approve a personal review queue item","tags":["EmailReceipts"],"parameters":[{"schema":{"type":"string","format":"cuid","pattern":"^[cC][0-9a-z]{6,}$"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/email-receipts/personal/review-queue/{id}/dismiss":{"post":{"summary":"Dismiss a personal review queue item","tags":["EmailReceipts"],"parameters":[{"schema":{"type":"string","format":"cuid","pattern":"^[cC][0-9a-z]{6,}$"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/email-receipts/business/address":{"get":{"summary":"Get or lazily create the Business Group forwarding address","tags":["EmailReceipts"],"responses":{"200":{"description":"Default Response"}}}},"/api/email-receipts/business/address/rotate":{"post":{"summary":"Rotate the Business Group forwarding address","tags":["EmailReceipts"],"responses":{"200":{"description":"Default Response"}}}},"/api/email-receipts/business/review-queue":{"get":{"summary":"List Business Group review queue items","tags":["EmailReceipts"],"responses":{"200":{"description":"Default Response"}}}},"/api/email-receipts/business/review-queue/assign-options":{"get":{"summary":"List Business Group members eligible for assignment","tags":["EmailReceipts"],"responses":{"200":{"description":"Default Response"}}}},"/api/email-receipts/business/review-queue/{id}/assign":{"post":{"summary":"Assign a Business Group review queue item to a member","tags":["EmailReceipts"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"cognitoUserId":{"type":"string","minLength":1},"accountId":{"type":"string","format":"cuid","pattern":"^[cC][0-9a-z]{6,}$"}},"required":["cognitoUserId"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","format":"cuid","pattern":"^[cC][0-9a-z]{6,}$"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/email-receipts/business/review-queue/{id}/dismiss":{"post":{"summary":"Dismiss a Business Group review queue item","tags":["EmailReceipts"],"parameters":[{"schema":{"type":"string","format":"cuid","pattern":"^[cC][0-9a-z]{6,}$"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/expenses/{id}/suggestions/{index}/apply":{"patch":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"index","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/expenses/{id}/suggestions/{index}/dismiss":{"patch":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"index","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/purchases/":{"get":{"responses":{"200":{"description":"Default Response"}}},"post":{"responses":{"200":{"description":"Default Response"}}}},"/api/purchases/{id}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"put":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"patch":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/purchases/{id}/items":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/purchases/{id}/items/{itemId}":{"put":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"itemId","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"path","name":"itemId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/purchase-items/":{"get":{"summary":"Search expense items across all expenses","tags":["Expense Items"],"description":"Search and filter expense items with pagination, sorting, category filtering, date range, and text search","parameters":[{"schema":{"default":1,"type":"integer","minimum":1,"maximum":9007199254740991},"in":"query","name":"page","required":false},{"schema":{"default":20,"type":"integer","minimum":1,"maximum":100},"in":"query","name":"limit","required":false},{"schema":{"default":"purchaseDate","type":"string","enum":["name","price","purchaseDate","categoryCode"]},"in":"query","name":"sortBy","required":false},{"schema":{"default":"desc","type":"string","enum":["asc","desc"]},"in":"query","name":"sortOrder","required":false},{"schema":{"type":"string","minLength":1,"maxLength":100},"in":"query","name":"search","required":false},{"schema":{"type":"string","minLength":1,"maxLength":200},"in":"query","name":"exactName","required":false},{"schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"in":"query","name":"categories","required":false},{"schema":{"type":"string"},"in":"query","name":"dateFrom","required":false},{"schema":{"type":"string"},"in":"query","name":"dateTo","required":false},{"schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"in":"query","name":"merchants","required":false},{"schema":{"type":"string","enum":["EXPENSE","INCOME"]},"in":"query","name":"transactionType","required":false},{"schema":{"type":"string","minLength":3,"maxLength":3},"in":"query","name":"targetCurrency","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"price":{"type":"number"},"quantity":{"type":"number"},"unit":{"nullable":true,"type":"string"},"unitPrice":{"nullable":true,"type":"number"},"discount":{"nullable":true,"type":"number"},"itemType":{"type":"string","enum":["product","discount"]},"categoryCode":{"type":"string"},"notes":{"nullable":true,"type":"string"},"barcode":{"nullable":true,"type":"string"},"expenseId":{"type":"string"},"purchaseDate":{"type":"string"},"merchantName":{"type":"string"},"currencyCode":{"type":"string"},"convertedAmount":{"type":"number"},"convertedCurrencyCode":{"type":"string"}},"required":["id","name","price","quantity","categoryCode","expenseId","purchaseDate","merchantName","currencyCode"],"additionalProperties":false}},"pagination":{"type":"object","properties":{"page":{"type":"number"},"limit":{"type":"number"},"total":{"type":"number"},"totalPages":{"type":"number"},"hasMore":{"type":"boolean"}},"required":["page","limit","total","totalPages","hasMore"],"additionalProperties":false}},"required":["items","pagination"],"additionalProperties":false}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"detail":{"type":"string"},"instance":{"type":"string"}},"required":["type","title","status","detail"],"additionalProperties":{}}}}}}}},"/api/receipts/":{"post":{"responses":{"200":{"description":"Default Response"}}},"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/receipts/{id}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/api/log/":{"get":{"summary":"Get unified transaction log (expenses + incomes)","tags":["Log"],"parameters":[{"schema":{"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"expenseOffset","required":false},{"schema":{"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"incomeOffset","required":false},{"schema":{"type":"integer","minimum":1,"maximum":100},"in":"query","name":"limit","required":false},{"schema":{"type":"string","maxLength":255},"in":"query","name":"search","required":false},{"schema":{"type":"string","enum":["asc","desc"]},"in":"query","name":"sortOrder","required":false},{"schema":{"anyOf":[{"type":"array","items":{"type":"string","enum":["EXPENSE","INCOME"]}},{"type":"string","enum":["EXPENSE","INCOME"]}]},"in":"query","name":"types","required":false},{"schema":{"anyOf":[{"type":"array","items":{"type":"string","maxLength":255}},{"type":"string","maxLength":255}]},"in":"query","name":"merchants","required":false},{"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"string"}]},"in":"query","name":"persons","required":false},{"schema":{"type":"string","format":"cuid","pattern":"^[cC][0-9a-z]{6,}$"},"in":"query","name":"accountId","required":false},{"schema":{"type":"string","minLength":3,"maxLength":3,"pattern":"^[A-Z]{3}$"},"in":"query","name":"currencyCode","required":false},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false}],"responses":{"200":{"description":"Default Response"}}}}}}