Turn CSV and JSON data into professional HTML reports with a simple REST API.
- 4 Built-in Templates — Sales Summary, Expense Report, Inventory Status, and Invoice — ready to use out of the box
- Responsive HTML Output — clean, print-ready reports that look great on any device or as PDF exports
- Free Tier Available — start generating reports immediately with no credit card required
- API Key Authentication — simple
x-api-keyheader for authenticated tiers with higher limits
curl -X POST https://reportforge-api.vercel.app/api/signup \
-H "Content-Type: application/json" \
-d '{"email": "you@example.com"}'curl -X POST https://reportforge-api.vercel.app/api/json-to-report \
-H "Content-Type: application/json" \
-H "x-api-key: rf_your_api_key_here" \
-d '{ "template": "sales-summary", "title": "Q1 Sales Report", "data": [ {"item": "Widgets", "amount": 1250.00, "quantity": 50}, {"item": "Gadgets", "amount": 890.50, "quantity": 30} ] }'The response contains a complete HTML document you can open in any browser, embed in an email, or print to PDF.
{
"html": "<!DOCTYPE html>...",
"meta": {
"template": "sales-summary",
"rowCount": 2,
"columns": ["item", "amount", "quantity"],
"generatedAt": "2025-01-15T10:30:00.000Z"
}
}| Method | Endpoint | Description |
|---|---|---|
POST | /api/signup | Get a free API key |
POST | /api/json-to-report | Generate an HTML report from a JSON array |
POST | /api/csv-to-report | Generate an HTML report from raw CSV |
GET | /api/templates | List all available templates and their columns |
Base URL:https://reportforge-api.vercel.app
| Template | ID | Required Columns | Optional Columns |
|---|---|---|---|
| Sales Summary | sales-summary | item, amount | date, quantity, category, customer, region |
| Expense Report | expense-report | description, amount | date, category, vendor, payment_method, notes |
| Inventory Status | inventory-status | item, quantity | sku, category, location, reorder_level, unit_price, supplier |
| Invoice | invoice | description, amount | quantity, unit_price, tax_rate, date, invoice_number, client_name, client_email |
curl -X POST https://reportforge-api.vercel.app/api/json-to-report \
-H "Content-Type: application/json" \
-d '{ "template": "sales-summary", "title": "Monthly Sales", "data": [ {"item": "Widgets", "amount": 1250.00, "quantity": 50}, {"item": "Gadgets", "amount": 890.50, "quantity": 30}, {"item": "Sprockets", "amount": 445.75, "quantity": 15} ] }'{
"html": "<!DOCTYPE html><html lang=\"en\"><head><meta charset=\"UTF-8\">...</html>",
"meta": {
"template": "sales-summary",
"rowCount": 3,
"columns": ["item", "amount", "quantity"],
"generatedAt": "2025-06-15T14:22:00.000Z"
}
}The html field contains a self-contained HTML document with inline CSS — no external dependencies required.
constresponse=awaitfetch('https://reportforge-api.vercel.app/api/json-to-report',{method: 'POST',headers: {'Content-Type': 'application/json'},body: JSON.stringify({data: [{item: 'Widgets',amount: 1250.00,quantity: 50},{item: 'Gadgets',amount: 890.50,quantity: 30}],template: 'sales-summary',title: 'Q1 Sales Report'})});const{ html, meta }=awaitresponse.json();console.log(`Generated report: ${meta.rowCount} rows, template: ${meta.template}`);importrequestsresponse=requests.post(
'https://reportforge-api.vercel.app/api/json-to-report',
json={
'data': [
{'item': 'Widgets', 'amount': 1250.00, 'quantity': 50},
{'item': 'Gadgets', 'amount': 890.50, 'quantity': 30}
],
'template': 'sales-summary',
'title': 'Q1 Sales Report'
}
)
data=response.json()
print(f"Generated report: {data['meta']['rowCount']} rows")For the free tier, no API key is required. For Starter and Business tiers, include your key in the x-api-key header:
curl -X POST https://reportforge-api.vercel.app/api/json-to-report \
-H "Content-Type: application/json" \
-H "x-api-key: rf_your_api_key_here" \
-d '{...}'| Free | Starter | Business | |
|---|---|---|---|
| Price | $0/mo | $12/mo | $35/mo |
| Reports per day | 20 | 200 | Unlimited |
| Templates | All 4 | All 4 | All 4 |
| API key | Not required | Included | Included |
| Support | Community | Priority |
All errors return a consistent JSON format:
{
"error": {
"code": "INVALID_INPUT",
"message": "Field \"data\" is required and must be an array"
}
}| HTTP Status | Error Code | Description |
|---|---|---|
| 400 | INVALID_INPUT | Missing or malformed fields |
| 405 | INVALID_INPUT | Wrong HTTP method |
| 413 | INPUT_TOO_LARGE | Input exceeds tier size limit |
| 429 | RATE_LIMITED | Daily report limit exceeded |
| Resource | URL |
|---|---|
| Documentation | reportforge-api.vercel.app/docs |
| Blog | reportforge-api.vercel.app/blog |
| Status Page | reportforge-api.vercel.app/status |
| OpenAPI Spec | reportforge-api.vercel.app/openapi.json |
| Live Demo | reportforge-api.vercel.app |
| Product | Description | Link |
|---|---|---|
| DocForge | Convert documents between formats (PDF, DOCX, HTML, Markdown) with a simple API | docforge.dev |
| FormForge | Generate dynamic web forms from JSON schemas with validation and submission handling | formforge.dev |
This project is licensed under the MIT License.