SMART_BUDGET_RECOMMENDATION / API_DOCUMENTATION.md
LogicGoInfotechSpaces's picture
Initial smart budget API
847392c
# API Documentation
This is a **REST API** built with FastAPI. It provides endpoints for expense tracking and smart budget recommendations.
## Base URL
- **Local**: `http://localhost:8000`
- **Hugging Face**: `https://your-username-your-space.hf.space`
## Interactive Documentation
FastAPI automatically generates interactive API documentation:
- **Swagger UI**: `http://your-url/docs` - Interactive API explorer
- **ReDoc**: `http://your-url/redoc` - Alternative documentation format
## API Endpoints
### 1. Health Check
**GET** `/health`
Check if the API and database are running.
**Response:**
```json
{
"status": "healthy",
"database": "connected"
}
```
**Example:**
```bash
curl http://localhost:8000/health
```
---
### 2. Root Endpoint
**GET** `/`
Get API status.
**Response:**
```json
{
"message": "Smart Budget Recommendation API",
"status": "running"
}
```
---
### 3. Create Expense
**POST** `/expenses`
Create a new expense record.
**Request Body:**
```json
{
"user_id": "user123",
"amount": 3800,
"category": "Groceries",
"description": "Monthly groceries",
"date": "2024-01-15T00:00:00",
"type": "expense"
}
```
**Response:**
```json
{
"id": "507f1f77bcf86cd799439011",
"message": "Expense created successfully"
}
```
**Example:**
```bash
curl -X POST "http://localhost:8000/expenses" \
-H "Content-Type: application/json" \
-d '{
"user_id": "user123",
"amount": 3800,
"category": "Groceries",
"description": "Monthly groceries",
"date": "2024-01-15T00:00:00",
"type": "expense"
}'
```
---
### 4. Get Expenses
**GET** `/expenses?user_id={user_id}&limit={limit}`
Get expenses for a specific user.
**Query Parameters:**
- `user_id` (required): User identifier
- `limit` (optional): Maximum number of expenses to return (default: 100)
**Response:**
```json
[
{
"id": "507f1f77bcf86cd799439011",
"user_id": "user123",
"amount": 3800,
"category": "Groceries",
"description": "Monthly groceries",
"date": "2024-01-15T00:00:00",
"type": "expense"
}
]
```
**Example:**
```bash
curl "http://localhost:8000/expenses?user_id=user123&limit=10"
```
---
### 5. Create Budget
**POST** `/budgets`
Create a new budget.
**Request Body:**
```json
{
"user_id": "user123",
"category": "Groceries",
"amount": 4000,
"period": "monthly",
"start_date": "2024-02-01T00:00:00",
"end_date": "2024-02-29T00:00:00"
}
```
**Response:**
```json
{
"id": "507f1f77bcf86cd799439012",
"message": "Budget created successfully"
}
```
---
### 6. Get Budgets
**GET** `/budgets?user_id={user_id}`
Get budgets for a specific user.
**Query Parameters:**
- `user_id` (required): User identifier
**Response:**
```json
[
{
"id": "507f1f77bcf86cd799439012",
"user_id": "user123",
"category": "Groceries",
"amount": 4000,
"period": "monthly",
"start_date": "2024-02-01T00:00:00",
"end_date": "2024-02-29T00:00:00"
}
]
```
---
### 7. Get Smart Budget Recommendations ⭐
**GET** `/recommendations/{user_id}?month={month}&year={year}`
Get personalized budget recommendations based on past spending behavior.
**Path Parameters:**
- `user_id` (required): User identifier
**Query Parameters:**
- `month` (optional): Target month (1-12). Defaults to next month if not provided
- `year` (optional): Target year. Defaults to next year if not provided
**Response:**
```json
[
{
"category": "Groceries",
"average_expense": 3800.0,
"recommended_budget": 4000.0,
"reason": "Your average monthly grocery expense is Rs.3,800. We suggest setting your budget to Rs.4,000 for next month (includes a 5% buffer for variability).",
"confidence": 0.85
},
{
"category": "Transport",
"average_expense": 2100.0,
"recommended_budget": 2200.0,
"reason": "Your average monthly transport expense is Rs.2,100. We suggest setting your budget to Rs.2,200 for next month (includes a 5% buffer for variability).",
"confidence": 0.75
}
]
```
**Example:**
```bash
# Get recommendations for next month (default)
curl "http://localhost:8000/recommendations/user123"
# Get recommendations for specific month
curl "http://localhost:8000/recommendations/user123?month=3&year=2024"
```
**How it works:**
- Analyzes expenses from the past 6 months
- Calculates average monthly spending per category
- Adds a 5-10% buffer based on spending variability
- Returns recommendations sorted by average expense (highest first)
---
### 8. Get Category Expenses
**GET** `/category-expenses/{user_id}?months={months}`
Get average expenses by category for the past N months.
**Path Parameters:**
- `user_id` (required): User identifier
**Query Parameters:**
- `months` (optional): Number of months to analyze (default: 3)
**Response:**
```json
[
{
"category": "Groceries",
"average_monthly_expense": 3800.0,
"total_expenses": 12,
"months_analyzed": 3
},
{
"category": "Transport",
"average_monthly_expense": 2100.0,
"total_expenses": 6,
"months_analyzed": 3
}
]
```
**Example:**
```bash
curl "http://localhost:8000/category-expenses/user123?months=6"
```
---
## Using the API with Python
```python
import requests
BASE_URL = "http://localhost:8000"
# Create an expense
expense = {
"user_id": "user123",
"amount": 3800,
"category": "Groceries",
"description": "Monthly groceries",
"date": "2024-01-15T00:00:00",
"type": "expense"
}
response = requests.post(f"{BASE_URL}/expenses", json=expense)
print(response.json())
# Get recommendations
response = requests.get(f"{BASE_URL}/recommendations/user123")
recommendations = response.json()
for rec in recommendations:
print(f"{rec['category']}: {rec['recommended_budget']}")
print(f"Reason: {rec['reason']}")
```
## Using the API with JavaScript/Fetch
```javascript
const BASE_URL = "http://localhost:8000";
// Create an expense
const expense = {
user_id: "user123",
amount: 3800,
category: "Groceries",
description: "Monthly groceries",
date: "2024-01-15T00:00:00",
type: "expense"
};
fetch(`${BASE_URL}/expenses`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(expense)
})
.then(res => res.json())
.then(data => console.log(data));
// Get recommendations
fetch(`${BASE_URL}/recommendations/user123`)
.then(res => res.json())
.then(recommendations => {
recommendations.forEach(rec => {
console.log(`${rec.category}: ${rec.recommended_budget}`);
console.log(`Reason: ${rec.reason}`);
});
});
```
## Error Responses
The API returns standard HTTP status codes:
- `200 OK` - Request successful
- `400 Bad Request` - Invalid request data
- `422 Unprocessable Entity` - Validation error
- `500 Internal Server Error` - Server error
Error response format:
```json
{
"detail": "Error message description"
}
```
## CORS
The API has CORS enabled, allowing requests from any origin. This makes it easy to integrate with frontend applications.