LumiParser

Core API

Batch upload

Upload up to 10 documents in a single request.

Batch endpoint

POST/v1/invoices/batch
curl -X POST https://api.lumiparser.com/v1/invoices/batch \
  -H "Authorization: Bearer inv_live_YOUR_KEY" \
  -F "file=@invoice1.pdf" \
  -F "file=@invoice2.pdf"

By default every file in a batch is parsed as an invoice. Send an optional document_type field (one of invoice, receipt, purchase_order, bank_statement) to apply one type to the whole batch — it must come before the file parts in the request body. A single batch can only contain one document type.

curl -X POST https://api.lumiparser.com/v1/invoices/batch \
  -H "Authorization: Bearer inv_live_YOUR_KEY" \
  -F "document_type=receipt" \
  -F "file=@receipt1.png" \
  -F "file=@receipt2.png"

Response

Returns 202 Accepted immediately with an array of job IDs:

{
  "jobs": [
    { "invoice_id": "inv_a1b2c3d4e5f6g7h8", "file_name": "invoice1.pdf", "status": "pending" },
    { "invoice_id": "inv_b2c3d4e5f6g7h8i9", "file_name": "invoice2.pdf", "status": "pending" },
    { "invoice_id": "inv_c3d4e5f6g7h8i9j0", "file_name": "receipt.png",  "status": "pending" }
  ]
}

Each document is parsed in the background. Use webhooks to receive a notification per document as it completes, or poll each ID individually.

Limits

Max files per request10
Max file size per file5MB (free) / 25MB (paid)
Quota consumption1 credit per file (not per request)
Unsupported filesSilently skipped — check jobs array length

Node.js example

const FormData = require('form-data');
const fs       = require('fs');
const fetch    = require('node-fetch');

const form = new FormData();
form.append('document_type', 'receipt'); // must be appended before the files
form.append('file', fs.createReadStream('./receipt1.png'));
form.append('file', fs.createReadStream('./receipt2.png'));

const res = await fetch('https://api.lumiparser.com/v1/invoices/batch', {
  method: 'POST',
  headers: { Authorization: `Bearer ${process.env.INVOICE_API_KEY}` },
  body: form,
});

const { jobs } = await res.json();
console.log(`Queued ${jobs.length} documents`);
// jobs[0].invoice_id → poll or wait for webhook