API /
Reference /
Expenses
Create line item
POST
https://api.light.inc/v1/expenses/{expenseId}/line-items
Every field is optional here; reimbursementCategoryId, originalAmount and description only become mandatory at POST /v1/expenses/submit. What is given is validated: the category (and any accountId) must belong to the user's entity (EXPENSE_VALIDATION_FAILED). billingAmount is derived from originalAmount when the expense already has a currency and date. Only while the expense is IN_DRAFT or CREATED.
Authorization
Send one of these on every request. See
Authentication for how to get credentials.
API key Basic authentication header of the form Basic <api_key> , where <api_key> is your api key.
Bearer token
Request body
application/json;charset=UTF-8
originalAmount
integer · int64
billingAmount
integer · int64
accountId
string · uuid
costCenterId
string · uuid
description
string
reimbursementCategoryId
string · uuid
Response
id
string · uuid
expenseId
string · uuid
originalAmount
integer · int64
billingAmount
integer · int64
accountId
string · uuid
costCenterId
string · uuid
description
string
reimbursementCategoryId
string · uuid
createdAt
string · date-time
updatedAt
string · date-time
cURL
JavaScript
Python
Copy
curl -X POST "https://api.light.inc/v1/expenses/3c90c3cc-0d44-4b50-8888-8dd25736052a/line-items" \
-H "Authorization: Basic YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"originalAmount": 100000,
"billingAmount": 100000,
"accountId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"costCenterId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"description": "string",
"reimbursementCategoryId": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}'
Copy
const res = await fetch("https://api.light.inc/v1/expenses/3c90c3cc-0d44-4b50-8888-8dd25736052a/line-items", {
method: "POST",
headers: {
Authorization: `Basic ${process.env.LIGHT_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"originalAmount": 100000,
"billingAmount": 100000,
"accountId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"costCenterId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"description": "string",
"reimbursementCategoryId": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}),
});
const data = await res.json();
Copy
import os, requests
res = requests.post(
"https://api.light.inc/v1/expenses/3c90c3cc-0d44-4b50-8888-8dd25736052a/line-items",
headers={"Authorization": f"Basic {os.environ['LIGHT_API_KEY']}"},
json={
"originalAmount": 100000,
"billingAmount": 100000,
"accountId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"costCenterId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"description": "string",
"reimbursementCategoryId": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
},
)
data = res.json()
Example request
Copy
{
"originalAmount": 100000,
"billingAmount": 100000,
"accountId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"costCenterId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"description": "string",
"reimbursementCategoryId": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
Generated from the schema: shapes and types are real, values are placeholders, and fields that exclude each other are all shown. Do not send it unchanged.
Example response
Copy
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"expenseId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"originalAmount": 100000,
"billingAmount": 100000,
"accountId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"costCenterId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"description": "string",
"reimbursementCategoryId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"createdAt": "2026-01-15T09:30:00Z",
"updatedAt": "2026-01-15T09:30:00Z"
}
Generated from the schema: shapes and types are real, values are placeholders.