API Documentation

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

Authentication

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.

Documents

GET /v1/documents

Retrieve a paginated list of your documents.

Query Parameters

ParameterTypeDescription
pageintegerPage number (default: 1)
per_pageintegerItems per page (max: 100, default: 25)
typestringFilter by type: invoice, quote, receipt, purchase_order, estimate
statusstringFilter 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"
POST /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"
  }'
GET /v1/documents/:id

Retrieve a single document by ID.

curl https://invouno.com/v1/documents/doc_abc123 \
  -H "Authorization: Bearer YOUR_API_KEY"
PUT /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"}'
DELETE /v1/documents/:id

Delete a document permanently.

curl -X DELETE https://invouno.com/v1/documents/doc_abc123 \
  -H "Authorization: Bearer YOUR_API_KEY"
GET /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

Clients

GET /v1/clients

List all clients.

curl https://invouno.com/v1/clients \
  -H "Authorization: Bearer YOUR_API_KEY"
POST /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"
  }'
GET /v1/clients/:id

Retrieve a single client.

PUT /v1/clients/:id

Update a client.

DELETE /v1/clients/:id

Delete a client. This will not delete their documents.

Usage

GET /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}
}

Templates

GET /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"}
  ]
}

Error Codes

The API uses standard HTTP status codes. Errors include a JSON body with error and message fields.

CodeMeaningDescription
200OKRequest succeeded
201CreatedResource created successfully
400Bad RequestInvalid or missing parameters
401UnauthorizedMissing or invalid API key
403ForbiddenInsufficient permissions
404Not FoundResource does not exist
422UnprocessableValidation failed
429Rate LimitedToo many requests. Retry after the time in the Retry-After header.
500Server ErrorInternal error. Contact support if persistent.
# Error response format
{
  "error": "validation_error",
  "message": "The type field is required",
  "details": {
    "type": "This field is required"
  }
}