Skip to content

API reference

Create and read customers, quotes, and invoices programmatically. Generate a key from your portal's Settings → API keys page.

Authentication

Send your key as a Bearer token on every request. Keys are tenant-scoped - you never pass a tenant id, it's resolved from the key itself.

curl https://quotup.com/api/v1/customers \
  -H "Authorization: Bearer qk_..."
Customers

GET /api/v1/customers · POST /api/v1/customers · GET /api/v1/customers/:id · PATCH /api/v1/customers/:id · DELETE /api/v1/customers/:id

curl -X POST https://quotup.com/api/v1/customers \
  -H "Authorization: Bearer qk_..." \
  -H "Content-Type: application/json" \
  -d '{"name": "Acme Corp", "email": "billing@acme.com"}'
Quotes & invoices

GET and POST at /api/v1/quotes and /api/v1/invoices. Line items reference a product/service by id, or stand alone with just a description and price. Optional: depositPercent on quotes (0-100, due when the customer approves) and deposit on invoices (an amount the customer can pay upfront); discountType ("percent" or "amount") with discountValue; and per line discountPercent and taxRate (omit it to use the document's taxRate).

curl -X POST https://quotup.com/api/v1/quotes \
  -H "Authorization: Bearer qk_..." \
  -H "Content-Type: application/json" \
  -d '{
    "customerId": "...",
    "issueDate": "2026-01-15",
    "taxRate": 0,
    "lineItems": [
      { "description": "Consulting", "quantity": 2, "unitPrice": 150 }
    ]
  }'
Errors & limits
Every response is JSON. Errors look like { "error": "message" } with a matching HTTP status - 401 for a missing/invalid/revoked key, 404 for a resource that doesn't exist (or isn't yours), 422 if you've hit your plan's limits, 400 for a malformed request body.