API Blueprint Generator
Stop writing APIs twice. Write the spec once, get the working code.
🚀 Quick Start
Transform this simple Markdown specification:
# Todo API
## Data Models
### Todo
- id: integer (primary key)
- title: string (required)
- completed: boolean (default: false)
- created_at: datetime
## Endpoints
### GET /todos
**Description**: Get all todos
**Response**:
- 200: `{"todos": [...]}`
### POST /todos
**Description**: Create a new todo
**Request Body**:
```json
{
"title": "Buy groceries"
}
Response:
- 201:
{"id": 1, "title": "Buy groceries", "completed": false}
Into a production-ready API in seconds:
```bash
pip install api-blueprint-generator
blueprint generate todo-spec.md --output todo-api
cd todo-api && docker-compose up
Result: A working Flask API with a database, validation, tests, and documentation available at http://localhost:5000.
🎯 Why API Blueprint Generator?
The Problem
- Writing API documentation, then implementing the same logic again.
- Manually keeping documentation and code in sync.
- Starting every API project from scratch.
- Inconsistent patterns across team projects.
The Solution
- Single Source of Truth: One Markdown file defines everything.
- Production Ready: The generated code includes tests, validation, and deployment configuration.
- Time Savings: A 70% reduction in API scaffolding time.
- Best Practices: Follows established patterns for security, validation, and structure.
What You Get
📁 your-api/
├── 🐍 app/
│ ├── __init__.py # Flask app factory
│ ├── models.py # SQLAlchemy models
│ ├── routes/ # Generated endpoints
│ ├── schemas.py # Request/response validation
│ └── middleware.py # Auth & rate limiting
├── 🗄️ migrations/ # Database migrations
├── 🧪 tests/ # Comprehensive test suite
├── 🐳 docker-compose.yml # Local development setup
├── 📋 requirements.txt # Project dependencies
└── 📖 docs/ # Interactive API documentation
📋 Installation
Using pip (Recommended)
pip install api-blueprint-generator
Using Docker
docker pull blueprintgen/api-generator
docker run -v $(pwd):/workspace blueprintgen/api-generator generate spec.md
From Source
git clone https://github.com/yourusername/api-blueprint-generator.git
cd api-blueprint-generator
pip install -e .
🔧 Usage
Basic Generation
# Generate API from a markdown spec
blueprint generate my-api-spec.md
# Specify the output directory
blueprint generate my-api-spec.md --output my-project
# Use a different backend
blueprint generate my-api-spec.md --backend fastapi
# Include PostgreSQL setup
blueprint generate my-api-spec.md --database postgresql
Configuration File
Create a blueprint.yml file for project defaults:
backend: flask # flask, fastapi
database: postgresql # sqlite, postgresql, mysql
auth_type: jwt # jwt, session, oauth, none
include_tests: true
docker_setup: true
api_prefix: "/api/v1"
cors_enabled: true
rate_limiting: true
Development Workflow
- Generate your API:
blueprint generate api-spec.md --output my-api - Run locally:
cd my-api && docker-compose up --build - Regenerate:
blueprint generate ../api-spec.md --output . --overwrite - Run tests:
python -m pytest tests/ - Deploy:
docker build -t my-api .
📝 Specification Format
Complete Example
# E-commerce API
## Authentication
JWT Bearer token required for protected endpoints.
## Configuration
- Base URL: `/api/v1`
- Rate Limit: 100 requests per minute
- CORS: Enabled for all origins
## Data Models
### User
- id: integer (primary key)
- email: string (unique, required, max_length=254)
- username: string (unique, required, max_length=50)
- password: string (required, min_length=8) [write-only]
- is_active: boolean (default: true)
- created_at: datetime (auto)
- updated_at: datetime (auto)
**Relationships**:
- orders: many Order
### Product
- id: integer (primary key)
- name: string (required, max_length=200)
- description: text (nullable)
- price: decimal (required, precision=10, scale=2)
- stock: integer (default: 0)
- category_id: integer (foreign_key: Category.id)
- created_at: datetime (auto)
**Relationships**:
- category: one Category
- order_items: many OrderItem
### Order
- id: integer (primary key)
- user_id: integer (foreign_key: User.id, required)
- status: string (choices: ['pending', 'confirmed', 'shipped', 'delivered'], default: 'pending')
- total: decimal (precision=10, scale=2)
- created_at: datetime (auto)
**Relationships**:
- user: one User
- order_items: many OrderItem
## Endpoints
### POST /auth/register
**Description**: Register a new user
**Public**: true
**Request Body**:
```json
{
"email": "user@example.com",
"username": "johndoe",
"password": "secretpassword"
}
Response:
- 201:
{"id": 1, "email": "user@example.com", "username": "johndoe"} - 400:
{"error": "Email already exists"}
POST /auth/login
Description: Authenticate user and return JWT token Public: true Request Body:
{
"email": "user@example.com",
"password": "secretpassword"
}
Response:
- 200:
{"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...", "user": {...}} - 401:
{"error": "Invalid credentials"}
GET /users/me
Description: Get current user profile Authentication: required Response:
- 200:
{"id": 1, "email": "user@example.com", "username": "johndoe"} - 401:
{"error": "Authentication required"}
GET /products
Description: List products with filtering and pagination Public: true Parameters:
- page: integer (default: 1, min: 1)
- limit: integer (default: 20, min: 1, max: 100)
- category: string (optional)
- min_price: decimal (optional)
- max_price: decimal (optional)
- search: string (optional, searches name and description) Response:
- 200:
{"products": [...], "total": 150, "page": 1, "pages": 8}
POST /products
Description: Create a new product (admin only) Authentication: required Permissions: admin Request Body:
{
"name": "Laptop",
"description": "High-performance laptop",
"price": 999.99,
"stock": 10,
"category_id": 1
}
Response:
- 201:
{"id": 1, "name": "Laptop", ...} - 400:
{"error": "Validation failed", "details": {...}} - 403:
{"error": "Admin access required"}
GET /products/{id}
Description: Get product by ID Public: true Parameters:
- id: integer (path parameter, required) Response:
- 200:
{"id": 1, "name": "Laptop", ...} - 404:
{"error": "Product not found"}
PUT /products/{id}
Description: Update product (admin only) Authentication: required Permissions: admin Parameters:
- id: integer (path parameter, required) Request Body: Same as POST /products Response:
- 200:
{"id": 1, "name": "Updated Laptop", ...} - 404:
{"error": "Product not found"} - 403:
{"error": "Admin access required"}
DELETE /products/{id}
Description: Delete product (admin only) Authentication: required Permissions: admin Parameters:
- id: integer (path parameter, required) Response:
- 204: No content
- 404:
{"error": "Product not found"}
POST /orders
Description: Create a new order Authentication: required Request Body:
{
"items": [
{"product_id": 1, "quantity": 2},
{"product_id": 2, "quantity": 1}
]
}
Response:
- 201:
{"id": 1, "status": "pending", "total": 1999.98, "items": [...]} - 400:
{"error": "Invalid product or insufficient stock"}
GET /orders
Description: Get user's orders Authentication: required Parameters:
- page: integer (default: 1)
- limit: integer (default: 10, max: 50) Response:
- 200:
{"orders": [...], "total": 5, "page": 1}
#### Supported Field Types
| Type | Description | Options |
|:---|:---|:---|
| `integer` | 32-bit integer | `min`, `max` |
| `bigint` | 64-bit integer | `min`, `max` |
| `string` | Variable length text | `min_length`, `max_length`, `pattern` |
| `text` | Long text field | - |
| `boolean` | True/false | - |
| `decimal` | Fixed-point decimal | `precision`, `scale`, `min`, `max` |
| `float` | Floating point | `min`, `max` |
| `datetime` | Date and time | `auto` (auto-populate) |
| `date` | Date only | - |
| `time` | Time only | - |
| `email` | Email address | - |
| `url` | URL | - |
| `uuid` | UUID string | - |
| `json` | JSON object/array | - |
#### Field Options
- `required`: Field must have a value.
- `nullable`: Field can be `null`/`None`.
- `unique`: Value must be unique across the table.
- `default`: Default value for the field.
- `choices`: List of allowed values.
- `primary key`: The primary key field.
- `foreign_key`: Reference to another table.
- `write-only`: Field only accepts input (e.g., passwords).
- `read-only`: Field only in responses (e.g., computed fields).
- `auto`: Auto-populate (e.g., timestamps, UUIDs).
---
### 🔧 Customization
#### Adding Custom Business Logic
Generated routes include clear customization points:
```python
# app/routes/products.py (generated)
@products_bp.route('/', methods=['POST'])
@require_auth
@validate_json(CreateProductSchema)
def create_product():
# Generated validation code
data = request.get_json()
# CUSTOMIZATION POINT: Add your business logic here
# Example: Check inventory, send notifications, etc.
# Generated persistence code
product = Product(**data)
db.session.add(product)
db.session.commit()
return jsonify(product.to_dict()), 201
Custom Templates
Override any generated file by creating a templates directory:
mkdir templates
cp ~/.api-blueprint/templates/routes.py.j2 templates/
# Edit templates/routes.py.j2 with your customizations
blueprint generate spec.md --template-dir templates
Middleware Customization
The app/middleware.py file is generated with customization points for authentication, logging, and more.
🧪 Testing
Generated projects include comprehensive test suites:
# Run all tests
python -m pytest
# Run with coverage
python -m pytest --cov=app tests/
# Run a specific test file
python -m pytest tests/test_products.py
# Run integration tests only
python -m pytest tests/integration/
Generated Test Types:
- Unit Tests: Model validation and business logic.
- Integration Tests: Full API endpoint testing.
- Database Tests: Migration and constraint validation.
- Authentication Tests: Permission and token validation.
- Performance Tests: Response time benchmarks.
🚀 Deployment
Local Development
docker-compose up
- API:
http://localhost:5000 - Docs:
http://localhost:5000/docs - Database: PostgreSQL on port
5432
Production Deployment
Docker Container:
docker build -t my-api .
docker run -p 8000:8000 \
-e DATABASE_URL=postgresql://... \
-e JWT_SECRET_KEY=... \
my-api
Environment Variables:
DATABASE_URL: Required connection string.JWT_SECRET_KEY: Required for JWT auth.- Optional:
FLASK_ENV,CORS_ORIGINS,RATE_LIMIT_PER_MINUTE,LOG_LEVEL.
Kubernetes:
- Generated k8s manifests are in
deploy/k8s/. kubectl apply -f deploy/k8s/
Railway/Heroku:
- Generated
Procfileandruntime.txtare included. git push heroku main
🛡️ Security Features
Built-in Security:
- Input Validation: Pydantic schemas for all endpoints.
- SQL Injection Prevention: SQLAlchemy ORM with parameterized queries.
- CORS Protection: Configurable origin restrictions.
- Rate Limiting: Per-IP and per-user limits.
- JWT Authentication: Secure token-based auth.
- Password Hashing:
bcryptwith salt rounds. - Security Headers: HTTPS enforcement, CSP, etc.
📊 Monitoring & Observability
Generated APIs include monitoring setup:
GET /health(Health check)GET /metrics(Prometheus metrics)GET /info(API version and build info)
Built-in metrics:
- Request count and response times
- Error rates by endpoint
- Database connection pool status
- Authentication success/failure rates
🤝 Contributing
We welcome contributions! See CONTRIBUTING.md for guidelines.
Development Setup
git clone https://github.com/yourusername/api-blueprint-generator.git
cd api-blueprint-generator
pip install -e ".[dev]"
python -m pytest
📚 Examples
Real-World Examples:
- Todo API - Simple CRUD operations
- E-commerce API - Complex relationships and auth
- Blog API - Content management with user roles
- Social Media API - Real-time features and file uploads
- IoT Data API - Time-series data and analytics
Community Templates:
- REST API Best Practices
- Microservice Template
- GraphQL Bridge
- Event-Driven Architecture
🆘 Support
- Documentation: Full Documentation, API Specification Guide, Deployment Guide, Customization Guide.
- Getting Help: GitHub Issues, Discord Community, Stack Overflow.
- Commercial Support: Patreon, Enterprise Support.
📄 License
This project is licensed under the MIT License - see the LICENSE file for details.
🙏 Acknowledgments
- Thanks to all contributors.
- Inspired by the API-first development movement.
- Built with love for the developer community.
🗺️ Roadmap
Current Version (1.0)
- ✅ Flask backend generation
- ✅ SQLite and PostgreSQL support
- ✅ JWT authentication
- ✅ Docker deployment
- ✅ Comprehensive test generation
Next Release (1.1)
- 🔄 FastAPI backend option
- 🔄 File upload handling
- 🔄 WebSocket endpoint support
- 🔄 GraphQL schema generation
Future Versions
- 🔮 Django REST framework backend
- 🔮 Microservice architecture templates
- 🔮 OpenAPI 3.1 full compatibility
- 🔮 Auto-scaling deployment configs
- 🔮 AI-powered API optimization suggestions
Ready to transform your API development workflow?
pip install api-blueprint-generator
echo "# My First API" > api.md
blueprint generate api.md
Join thousands of developers who've already made the switch to specification-first development.
Metadata
Release files for api-blueprint-generator 1.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| api_blueprint_generator-1.0.0.tar.gz | 48.8 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| api_blueprint_generator-1.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 108.2 kB
Release files / api_blueprint_generator-1.0.0.tar.gz
| Download URL | api_blueprint_generator-1.0.0.tar.gz |
|---|---|
| Size | 48.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
56f266d45de75aeb3c17c97dff588f69db4afeb4547b750f8c9ee01b59ef9f1a
|
|
BLAKE2b-256 checksum How to use checksums |
b051f822a73d604c4ef1f97d4e08343823d3c5dcf5281c334003592331551473
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.3
|
Release files / api_blueprint_generator-1.0.0-py3-none-any.whl
| Download URL | api_blueprint_generator-1.0.0-py3-none-any.whl |
|---|---|
| Size | 59.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c8028a8ae6df3ec1eb50e1911bfe0ed2230ae26e26c389a4309cf9d527a39c25
|
|
BLAKE2b-256 checksum How to use checksums |
a0bf0fff25038ae094df9f0c63788df96c3134952f24ac24aa64609b816c02c8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.3
|
Security for api-blueprint-generator 1.0.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.