Public API

Versioned REST contract for web, native apps, and integrations. Use the OpenAPI file as the source of truth; generate clients with your toolchain (for example openapi-typescript).

Download openapi.yaml

Example endpoints

Illustrative snippets from your static export; validate against the OpenAPI spec.

List endpoints return meta.limit, meta.offset, and invoice lists echo meta.status when filtered. See the roadmap for cursor pagination, richer payloads, and outbound webhooks.

  • GET/api/v1/customers

    List customers with optional limit (1–100, default 100) and offset pagination.

    GET /api/v1/customers?limit=50&offset=0
    Authorization: Bearer <supabase_jwt>
    x-tenant-slug: your-workspace-slug
  • GET/api/v1/customers/{id}

    Fetch one customer by UUID.

    GET /api/v1/customers/<customer_uuid>
    Authorization: Bearer <supabase_jwt>
    x-tenant-slug: your-workspace-slug
  • PATCH/api/v1/customers/{id}

    Update name and/or email (empty string clears email).

    PATCH /api/v1/customers/<customer_uuid>
    Content-Type: application/json
    Authorization: Bearer <supabase_jwt>
    x-tenant-slug: your-workspace-slug
    
    { "name": "Acme Holdings Ltd", "email": "ap@acme.example" }
  • POST/api/v1/customers

    Create a customer (returns id for use with POST /invoices).

    POST /api/v1/customers
    Content-Type: application/json
    Authorization: Bearer <supabase_jwt>
    x-tenant-slug: your-workspace-slug
    
    { "name": "Acme Ltd", "email": "billing@acme.example" }
  • GET/api/v1/invoices

    List invoices with limit/offset and optional status filter (?status=draft&status=paid or ?status=draft,issued).

    GET /api/v1/invoices?limit=20&offset=0&status=draft&status=issued
    Authorization: Bearer <supabase_jwt>
    x-tenant-slug: your-workspace-slug
  • GET/api/v1/invoices/{id}

    Fetch one invoice with line rows and customer snapshot.

    GET /api/v1/invoices/<invoice_uuid>
    Authorization: Bearer <supabase_jwt>
    x-tenant-slug: your-workspace-slug
  • POST/api/v1/invoices

    Create an invoice (default issued). Pass lines[] for multi-row payloads (max 50); omit lines for single-line fields.

    POST /api/v1/invoices
    Content-Type: application/json
    Authorization: Bearer <supabase_jwt>
    x-tenant-slug: your-workspace-slug
    
    {
      "customer_id": "550e8400-e29b-41d4-a716-446655440000",
      "number": "INV-2048",
      "status": "draft",
      "lines": [
        { "description": "Consulting", "quantity": 2, "unit_price": 150, "tax_rate": 20 },
        { "description": "Materials", "quantity": 1, "unit_price": 49.99, "tax_rate": 0 }
      ]
    }
  • PATCH/api/v1/invoices/{id}

    Edit a draft invoice: adjust single-line fields, replace all rows with lines[], or set status issued to finalize.

    PATCH /api/v1/invoices/<invoice_uuid>
    Content-Type: application/json
    Authorization: Bearer <supabase_jwt>
    x-tenant-slug: your-workspace-slug
    
    {
      "lines": [
        { "description": "Consulting", "quantity": 2, "unit_price": 175, "tax_rate": 20 }
      ],
      "status": "issued"
    }
  • DELETE/api/v1/invoices/{id}

    Delete a draft invoice only (204 No Content).

    DELETE /api/v1/invoices/<invoice_uuid>
    Authorization: Bearer <supabase_jwt>
    x-tenant-slug: your-workspace-slug

Official SDKs

Placeholder SDK cards from your archive — publish packages when ready.

Python SDK

Type hints and async-friendly patterns.

JavaScript SDK

Node and browser; TypeScript definitions.

Ruby SDK

Gem for Rails and Ruby apps.

Ready to integrate?

Create a workspace, then issue API keys from your admin console when exposed.

Start trial