Financing an invoice
Your identifiers are the keys. externalId is whatever your system already calls the thing, and
every write is idempotent on it — so the safe way to integrate is to replay your ledger and let
the API settle what changed.
Money crosses this boundary as integer cents everywhere. 100000 is $1,000.00.
1. Sync the business
Code
legalName is the only required field. Send taxId if you hold one: it is what lets us recognise
a business several platforms serve as one company, and without it compliance cannot clear — we
deliberately do not guess. A contact field you omit is left as it was rather than cleared.
2. Sync the invoice
An invoice identifier is unique per payee, not per account: two of your customers may each
number an invoice 001, so both counterparties are named in the body.
Code
Both parties are upserted with the invoice, so step 1 is not a prerequisite — it is how you enrich a business with a tax identification number and contact details you did not have when the invoice first synced.
status is one of ISSUED, PARTIALLY_PAID, PAID, VOIDED. ISSUED is the only state an
advance can be requested against. Both dates are ISO date-times, not plain dates.
Loading a backlog? PUT /v1/invoices/imports/{externalId}
takes a CSV of up to 1000 rows, each row doing exactly what this call does — so re-uploading a
fixed file changes the rows you fixed and leaves the rest alone.
3. Quote it
A quote prices a face value for a business. It commits to nothing and creates nothing.
It names no invoice — you pass the amount directly — so you can quote before step 2, or for a
figure a vendor is only considering. It does name a business, and that one has to be synced
already: an identifier you have not sent us answers 404 business_not_found.
Code
4. Take the advance
This one names the invoice — and the payee with it, because an invoice identifier is only unique per payee:
Code
It prices the advance again, checks the business is eligible and within its limit, and creates it. It is idempotent on the invoice: calling it twice does not advance twice.
Three refusals are worth handling by name, all 409:
invoice_not_financeable— the invoice itself cannot be advanced against: notISSUED, already financed, or past what we will take.business_not_eligible— one of the three gates is not clear. ReadGET /v1/organizations/{externalId}to see which.concentration_exceeded— within limits individually, but too much of this business's exposure already sits with one payer.
5. Then stop polling
The money moves, the invoice is eventually paid, and the loan settles — none of it on your
request's clock. Subscribe to webhooks rather than polling: partner.loan.issued
when the vendor has been paid, partner.invoice.paid when the payer settles.

