Light APIv1.0.0

API / Examples

Create an invoice payable

End-to-end: create a vendor invoice with line items and a document, then submit it for approval.

This example walks through creating a vendor invoice programmatically — creating the invoice, adding line items, uploading the document and submitting it for approval.

const API_KEY = process.env.LIGHT_API_KEY;
const BASE_URL = 'https://api.light.inc';

const headers = {
  'Authorization': `Basic ${API_KEY}`,
  'Content-Type': 'application/json',
};

async function createInvoicePayable() {
  // 1. Create the invoice
  const invoiceRes = await fetch(`${BASE_URL}/v1/invoice-payables`, {
    method: 'POST',
    headers,
    body: JSON.stringify({
      vendorId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
      invoiceNumber: 'INV-2026-042',
      issueDate: '2026-01-15',
      dueDate: '2026-02-15',
      currency: 'GBP',
    }),
  });
  const invoice = await invoiceRes.json();
  console.log('Created invoice:', invoice.id);

  // 2. Add line items
  const lines = [
    { description: 'Software license', quantity: 1, unitPrice: 120000 },
    { description: 'Support contract', quantity: 1, unitPrice: 30000 },
  ];

  for (const line of lines) {
    await fetch(`${BASE_URL}/v1/invoice-payables/${invoice.id}/line-items`, {
      method: 'POST',
      headers,
      body: JSON.stringify(line),
    });
  }
  console.log('Added', lines.length, 'line items');

  // 3. Upload the invoice document
  const uploadUrlRes = await fetch(
    `${BASE_URL}/v1/invoice-payables/${invoice.id}/document/upload-url`,
    {
      method: 'POST',
      headers,
      body: JSON.stringify({
        fileName: 'invoice-042.pdf',
        contentType: 'application/pdf',
      }),
    }
  );
  const { uploadUrl } = await uploadUrlRes.json();

  // Upload the file to the presigned URL
  const fs = require('fs');
  const fileBuffer = fs.readFileSync('./invoice-042.pdf');
  await fetch(uploadUrl, {
    method: 'PUT',
    headers: { 'Content-Type': 'application/pdf' },
    body: fileBuffer,
  });
  console.log('Uploaded document');

  // 4. Submit for approval
  await fetch(`${BASE_URL}/v1/invoice-payables/${invoice.id}/submit-for-approval`, {
    method: 'POST',
    headers,
  });
  console.log('Submitted for approval');

  return invoice;
}

createInvoicePayable().catch(console.error);
import requests
import os

API_KEY = os.environ['LIGHT_API_KEY']
BASE_URL = 'https://api.light.inc'
headers = {
    'Authorization': f'Basic {API_KEY}',
    'Content-Type': 'application/json',
}

# 1. Create the invoice
invoice = requests.post(f'{BASE_URL}/v1/invoice-payables', headers=headers, json={
    'vendorId': '3c90c3cc-0d44-4b50-8888-8dd25736052a',
    'invoiceNumber': 'INV-2026-042',
    'issueDate': '2026-01-15',
    'dueDate': '2026-02-15',
    'currency': 'GBP',
}).json()

invoice_id = invoice['id']
print(f'Created invoice: {invoice_id}')

# 2. Add line items
lines = [
    {'description': 'Software license', 'quantity': 1, 'unitPrice': 120000},
    {'description': 'Support contract', 'quantity': 1, 'unitPrice': 30000},
]

for line in lines:
    requests.post(
        f'{BASE_URL}/v1/invoice-payables/{invoice_id}/line-items',
        headers=headers,
        json=line,
    )
print(f'Added {len(lines)} line items')

# 3. Upload the invoice document
upload_url_data = requests.post(
    f'{BASE_URL}/v1/invoice-payables/{invoice_id}/document/upload-url',
    headers=headers,
    json={'fileName': 'invoice-042.pdf', 'contentType': 'application/pdf'},
).json()

with open('./invoice-042.pdf', 'rb') as f:
    requests.put(
        upload_url_data['uploadUrl'],
        headers={'Content-Type': 'application/pdf'},
        data=f.read(),
    )
print('Uploaded document')

# 4. Submit for approval
requests.post(f'{BASE_URL}/v1/invoice-payables/{invoice_id}/submit-for-approval', headers=headers)
print('Submitted for approval')