---
title: "Create expense"
method: POST
path: "/v1/expenses"
tags: ["v1 - Expenses"]
---

# Create expense

`POST /v1/expenses`

## Request

- Base URL: `https://light.inc` (the document declares no server; this is the origin it was published from)
- URL: `https://light.inc/v1/expenses`
- Auth: one of:
  - API key in header `Authorization`
  - HTTP bearer

Creates an expense synchronously from a receipt uploaded with `shouldAutoCreateExpense: false` and the given line items. No OCR runs: the fields you send are what is stored. A PDF receipt is kept as-is; JPEG, PNG, HEIC and TIFF receipts are converted to PDF first. The expense is created as a draft for the authenticated user and is included in the next POST /v1/expenses/submit.

## Headers

- `X-Idempotency-Key` string

## Request body

- ExternalCreateExpenseRequestV1Model
  - `receiptDocumentKey` string, required: Key returned by POST /v1/expenses/upload-url called with shouldAutoCreateExpense=false, once the file has been uploaded. A PDF is attached as-is; JPEG, PNG, HEIC and TIFF files are converted to PDF first.
  - `originalCurrency` string, required
  - `performedDate` string, date, required: Date the expense was incurred; also the date of the exchange rate used when billingAmount is derived
  - `detailedDescription` string, nullable: Free-text description of the expense as a whole; each line carries its own description
  - `lineItems` ExternalCreateExpenseLineItemRequestV1Model[], required: At least one line. The reimbursement category of a line drives the GL account and tax code of the reimbursement.
    - `originalAmount` integer, required: Amount in minor units of originalCurrency (e.g. 1250 for 12.50)
    - `billingAmount` integer, nullable: Amount in minor units of the user's reimbursement currency. Optional: equals originalAmount when the currencies match, otherwise derived from the exchange rate of performedDate.
    - `description` string, required: What the line is for; shown on the expense and on the reimbursement
    - `reimbursementCategoryId` string, uuid, required: Reimbursement category of the line, which decides the GL account and tax code on the reimbursement. Must belong to the user's company entity.

## Response `default`

default response

- ExternalExpenseV1Model
  - `id` string, uuid
  - `receiptDocumentKey` string
  - `originalCurrency` string
  - `billingCurrency` string
  - `status` 'CREATED' | 'IN_DRAFT' | 'SUBMITTED_FOR_REVIEW' | 'CANCELLED': ⚠️ This enum is not exhaustive; new values may be added in the future.
  - `userId` string, uuid
  - `companyId` string, uuid
  - `performedDate` string, date
  - `detailedDescription` string
  - `lineItems` ExternalExpenseLineItemV1Model[]
    - `id` string, uuid
    - `expenseId` string, uuid
    - `originalAmount` integer
    - `billingAmount` integer
    - `accountId` string, uuid
    - `costCenterId` string, uuid
    - `description` string
    - `reimbursementCategoryId` string, uuid
    - `createdAt` string, date-time
    - `updatedAt` string, date-time
  - `createdAt` string, date-time
  - `updatedAt` string, date-time

---

[API](https://skmtc.dev/light/apis/light-api.md) - [All operations](https://skmtc.dev/light/apis/light-api/llms.txt) - [OpenAPI document](https://skmtc.dev/light/apis/light-api/revisions/84f51306f648?raw)
