openapi: 3.0.3 info: { title: Expense API, version: 1.0.0 } servers: [ { url: https://your-domain.com/api/v1 } ] tags: [ { name: Expenses } ] security: [ { bearerAuth: [] } ] paths: /expenses: get: tags: [Expenses] summary: List expenses parameters: - in: query name: page schema: { type: integer, default: 1 } - in: query name: per_page schema: { type: integer, default: 20 } - in: query name: status schema: { type: string } - in: query name: category schema: { type: string } responses: "200": { description: Expenses retrieved } post: tags: [Expenses] summary: Create expense requestBody: required: true content: application/json: schema: type: object required: [category, amount, description, date_of_purchase] properties: category: { type: string } amount: { type: number } description: { type: string } retailor: { type: string } date_of_purchase: { type: string, format: date } purchased_by: { type: integer } status: { type: string } responses: "201": { description: Expense created } /expenses/{id}: get: tags: [Expenses] summary: Get expense by ID parameters: - in: path name: id required: true schema: { type: integer } responses: "200": { description: Expense } "404": { description: Not found } put: tags: [Expenses] summary: Update expense parameters: - in: path name: id required: true schema: { type: integer } requestBody: required: true content: application/json: schema: type: object properties: category: { type: string } amount: { type: number } description: { type: string } retailor: { type: string } date_of_purchase: { type: string, format: date } status: { type: string } status_reason: { type: string } responses: "200": { description: Expense updated } delete: tags: [Expenses] summary: Delete expense parameters: - in: path name: id required: true schema: { type: integer } responses: "200": { description: Expense deleted }