---
title: "Create Invoice"
method: POST
path: "/invoices"
tags: ["invoices"]
---

# Create Invoice

`POST /invoices`

## Request

- Base URL: `https://app.tascan.io/api/v1`
- URL: `https://app.tascan.io/api/v1/invoices`
- Auth: HTTP bearer

Create a client invoice and get its shareable link. Two ways to bill: (a) pass explicit line_items, or (b) pass project_id or task_list_ids plus hourly_rate (quarter-hour billing from first→last verified completion per list) or flat_rate_per_list, and TaScan builds one line per list from VERIFIED work ("<list> — 7/7 tasks verified · Sep 1 · 1.25h"); lists with no completions are skipped. A single-list invoice also mints a client-facing Service Report (acknowledge → pay) and links it. Returns invoice number, totals, url, and the work it billed.

## Request body

- object
  - `client_name` string, required: Bill-to name (person or company)
  - `client_email` string
  - `client_phone` string
  - `project_id` string: Bill every list in this project (auto line items)
  - `task_list_ids` string[]: Bill just these lists (auto line items)
  - `hourly_rate` number: Dollars per hour for auto line items
  - `flat_rate_per_list` number: Dollars per list for auto line items (used when no hourly_rate)
  - `min_hours` number: Minimum billable hours per list (e.g. 1)
  - `billing` object: Billing rules for auto line items. mode: hourly (default when hourly_rate given) | day_rate | flat. Overtime/double time are computed PER WORK DAY from verified completions: hours over overtime_after_hours (default 8) bill at overtime_multiplier (1.5×), hours over double_time_after_hours (12) at double_time_multiplier (2×); set overtime:false to disable. per_diem adds one line × work days (or per_diem_days). expenses are pass-through lines.
    - `mode` 'hourly' | 'day_rate' | 'flat'
    - `hourly_rate` number
    - `day_rate` number
    - `flat_rate_per_list` number
    - `min_hours` number
    - `overtime` boolean
    - `overtime_after_hours` number
    - `overtime_multiplier` number
    - `double_time_after_hours` number
    - `double_time_multiplier` number
    - `per_diem` number: Dollars per work day
    - `per_diem_days` number
    - `expenses` object[]
      - `description` string, required
      - `amount` number, required
      - `quantity` number
  - `line_items` object[]: Explicit lines instead of auto-billing
    - `description` string, required
    - `quantity` number
    - `unit_price` number, required
  - `tax_rate` number: Fraction, e.g. 0.0825 for 8.25%
  - `due_date` string: YYYY-MM-DD (default: 30 days out)
  - `notes` string: Payment terms / thank-you shown on the invoice
  - `company_name` string: Your company name on the attached Service Report (defaults to the org name)
  - `attach_service_report` boolean: Mint + link a Service Report for single-list invoices (default true)
  - `payment_options` object: Pay-how-you-like buttons on the invoice (defaults to the org's saved handles). Keys: venmo (@handle), cashapp ($cashtag), paypal (paypal.me name), zelle (phone/email), applecash (phone), other (free text e.g. "cash or check"). Stripe card checkout is separate and only shows when the org has invoice_payments enabled.
    - `venmo` string
    - `cashapp` string
    - `paypal` string
    - `zelle` string
    - `applecash` string
    - `other` string
  - `status` 'draft' | 'sent': Default sent

## Response `200`

Success. JSON body: { data: ... } or an error object { error, message }.

## Other responses

- `4XX`: Client error (validation, auth, scope, rate limit).

---

[API](https://skmtc.dev/tascan/apis/tascan-api.md) · [All operations](https://skmtc.dev/tascan/apis/tascan-api/llms.txt) · [OpenAPI document](https://skmtc.dev/tascan/apis/tascan-api/revisions/56fcd2861498?raw)
