The InvoUno API lets you create, manage, and send professional documents programmatically. It follows REST conventions with JSON request and response bodies.
Base URL
https://invouno.com/v1
Authenticate by including your API key in the Authorization header as a Bearer token. Get your API key from the Settings page.
curl https://invouno.com/v1/documents \
-H "Authorization: Bearer pk_live_your_api_key_here"
Security: Never expose your API key in client-side code. Use it only in server-to-server requests.
/v1/documents
Retrieve a paginated list of your documents.
Query Parameters
| Parameter | Type | Description |
|---|---|---|
| page | integer | Page number (default: 1) |
| per_page | integer | Items per page (max: 100, default: 25) |
| type | string | Filter by type: invoice, quote, receipt, purchase_order, estimate |
| status | string | Filter by status: draft, sent, paid, overdue, cancelled |
curl "https://invouno.com/v1/documents?type=invoice&status=paid&page=1" \
-H "Authorization: Bearer YOUR_API_KEY"
/v1/documents
Create a new document.
curl -X POST https://invouno.com/v1/documents \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"type": "invoice",
"client_id": "cl_abc123",
"currency": "USD",
"issued_date": "2026-03-01",
"due_date": "2026-03-31",
"items": [
{"title": "Website Design", "quantity": 1, "rate": 5000},
{"title": "Hosting (Annual)", "quantity": 1, "rate": 1200}
],
"tax_rate": 10,
"notes": "Payment due within 30 days",
"template": "modern"
}'
/v1/documents/:id
Retrieve a single document by ID.
curl https://invouno.com/v1/documents/doc_abc123 \
-H "Authorization: Bearer YOUR_API_KEY"
/v1/documents/:id
Update an existing document. Only draft documents can be updated.
curl -X PUT https://invouno.com/v1/documents/doc_abc123 \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"status": "sent", "notes": "Updated payment terms"}'
/v1/documents/:id
Delete a document permanently.
curl -X DELETE https://invouno.com/v1/documents/doc_abc123 \
-H "Authorization: Bearer YOUR_API_KEY"
/v1/documents/:id/pdf
Download a document as PDF.
curl https://invouno.com/v1/documents/doc_abc123/pdf \
-H "Authorization: Bearer YOUR_API_KEY" \
-o invoice.pdf
/v1/clients
List all clients.
curl https://invouno.com/v1/clients \
-H "Authorization: Bearer YOUR_API_KEY"
/v1/clients
Create a new client.
curl -X POST https://invouno.com/v1/clients \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Acme Corp",
"email": "[email protected]",
"company": "Acme Corporation",
"country": "United States"
}'
/v1/clients/:id
Retrieve a single client.
/v1/clients/:id
Update a client.
/v1/clients/:id
Delete a client. This will not delete their documents.
/v1/usage
Get your current billing period usage and limits.
curl https://invouno.com/v1/usage \
-H "Authorization: Bearer YOUR_API_KEY"
# Response
{
"plan": "growth",
"period": {"start": "2026-03-01", "end": "2026-03-31"},
"documents": {"used": 142, "limit": 1000},
"api_calls": {"used": 3420, "limit": 10000}
}
/v1/templates
List available document templates.
curl https://invouno.com/v1/templates \
-H "Authorization: Bearer YOUR_API_KEY"
# Response
{
"data": [
{"id": "clean", "name": "Clean", "description": "Minimal and modern"},
{"id": "modern", "name": "Modern", "description": "Bold with accent colors"},
{"id": "classic", "name": "Classic", "description": "Traditional business style"},
{"id": "minimal", "name": "Minimal", "description": "Ultra-clean with lots of whitespace"}
]
}
The API uses standard HTTP status codes. Errors include a JSON body with error and message fields.
| Code | Meaning | Description |
|---|---|---|
| 200 | OK | Request succeeded |
| 201 | Created | Resource created successfully |
| 400 | Bad Request | Invalid or missing parameters |
| 401 | Unauthorized | Missing or invalid API key |
| 403 | Forbidden | Insufficient permissions |
| 404 | Not Found | Resource does not exist |
| 422 | Unprocessable | Validation failed |
| 429 | Rate Limited | Too many requests. Retry after the time in the Retry-After header. |
| 500 | Server Error | Internal error. Contact support if persistent. |
# Error response format
{
"error": "validation_error",
"message": "The type field is required",
"details": {
"type": "This field is required"
}
}