A RESTful API built with Flask for tracking job applications throughout the hiring process. Manage your job search by recording applications, updating their status, and querying your application history.
- Create Applications: Add new job applications with company name, role, and status
- Track Status: Monitor application progress through different stages (applied, interview, offer, rejected)
- Query & Filter: Search applications by status with sorting and pagination support
- Update Progress: Modify application status as you move through the hiring pipeline
- Bulk Operations: Delete multiple applications by status
- RESTful Design: Clean, intuitive API endpoints following REST principles
- Framework: Flask 3.1.3
- Database: SQLite with SQLAlchemy ORM
- ORM: Flask-SQLAlchemy 3.1.1
- Server: Gunicorn 25.1.0 (production-ready)
- Language: Python 3.x
- Python 3.7 or higher
- pip (Python package manager)
- Clone the repository:
git clone <repository-url>
cd <project-directory>- Create and activate a virtual environment:
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate- Install dependencies:
pip install -r requirements.txt- Run the application:
python run.pyThe API will be available at http://localhost:5000
GET /applicationsQuery Parameters:
status- Filter by status (applied, interview, offer, rejected)sort- Sort by date (applied_ator-applied_atfor descending)limit- Limit number of resultsoffset- Offset for pagination
Example:
curl http://localhost:5000/applications?status=interview&sort=-applied_at&limit=10GET /applications/<id>Example:
curl http://localhost:5000/applications/1POST /applicationsRequest Body:
{
"company": "Tech Corp",
"role": "Software Engineer",
"status": "applied"
}Example:
curl -X POST http://localhost:5000/applications \
-H "Content-Type: application/json" \
-d '{"company":"Tech Corp","role":"Software Engineer","status":"applied"}'PUT /applications/<id>Request Body:
{
"status": "interview"
}Example:
curl -X PUT http://localhost:5000/applications/1 \
-H "Content-Type: application/json" \
-d '{"status":"interview"}'DELETE /applications/<id>Example:
curl -X DELETE http://localhost:5000/applications/1DELETE /applications?status=<status>Example:
curl -X DELETE "http://localhost:5000/applications?status=rejected"applied- Initial application submittedinterview- Interview stageoffer- Offer receivedrejected- Application rejected
| Field | Type | Description |
|---|---|---|
| id | Integer | Primary key (auto-generated) |
| company | String(100) | Company name (required) |
| role | String(100) | Job role/title (required) |
| status | String(20) | Application status (default: "applied") |
| applied_at | DateTime | Timestamp of application (auto-generated) |
.
├── app/
│ ├── __init__.py # Application factory
│ ├── db.py # Database initialization
│ ├── models.py # SQLAlchemy models
│ └── routes.py # API endpoints
├── instance/
│ └── jobtracker.db # SQLite database (auto-created)
├── requirements.txt # Python dependencies
├── run.py # Application entry point
└── README.md # This file
The API returns appropriate HTTP status codes:
200- Success201- Created400- Bad Request (invalid input)404- Not Found500- Internal Server Error
Error responses include a JSON body with an error field describing the issue.