> ## Documentation Index
> Fetch the complete documentation index at: https://docs.light.inc/llms.txt
> Use this file to discover all available pages before exploring further.

# Create an Invoice Payable

> End-to-end example: create a vendor invoice with line items and a document

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

## Complete Flow

<CodeGroup>
  ```javascript Node.js theme={null}
  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: 'vnd_abc123',
        invoiceNumber: 'INV-2025-042',
        issueDate: '2025-01-15',
        dueDate: '2025-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: 1200.00 },
      { description: 'Support contract', quantity: 1, unitPrice: 300.00 },
    ];

    for (const line of lines) {
      await fetch(`${BASE_URL}/v1/invoice-payables/${invoice.id}/lines`, {
        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`, {
      method: 'POST',
      headers,
    });
    console.log('Submitted for approval');

    return invoice;
  }

  createInvoicePayable().catch(console.error);
  ```

  ```python Python theme={null}
  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': 'vnd_abc123',
      'invoiceNumber': 'INV-2025-042',
      'issueDate': '2025-01-15',
      'dueDate': '2025-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': 1200.00},
      {'description': 'Support contract', 'quantity': 1, 'unitPrice': 300.00},
  ]

  for line in lines:
      requests.post(
          f'{BASE_URL}/v1/invoice-payables/{invoice_id}/lines',
          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', headers=headers)
  print('Submitted for approval')
  ```
</CodeGroup>
