Lunch
Lunch Partner API

Sync the businesses you serve, and read where each one stands.


Set where this business's advances are paid

PUT
https://api.luxor.lunchpayments.com
/v1/organizations/{externalId}/payout-account

Use this when you already hold the vendor's bank details and would rather not ask them to enter them again. The account you send becomes where we send their advances, and the bank step disappears from their onboarding.

It replaces rather than adds: one destination per business, and sending different numbers moves it. Re-sending the SAME numbers leaves the account untouched, so replaying your ledger through this route is safe. The one exception is a label you send explicitly, which updates the name we show our operations team; omitting label on a replay never clears one you set earlier. Once you supply an account, the vendor can no longer change it themselves. They will be told to come back to you, so this endpoint is how it changes from then on.

We check the routing number against its check digit and nothing else. We do not verify that the account exists or that this business owns it, so the details you send are the details their money goes to.

Set where this business's advances are paidpath Parameters

externalId
string · minLength: 1 · required

Your own identifier for the business, as supplied when you synced it. You never need to store a Lunch identifier.

Your own identifier for the business, as supplied when you synced it. You never need to store a Lunch identifier.

Set where this business's advances are paid Request Body

accountNumber
string · pattern: ^\d{4,17}$ · required
routingNumber
string · required

Nine digits. Checked against its ABA check digit.

label
string · minLength: 1

What you call this account. Shown to our operations team; the last four digits stand in when you leave it out.

Set where this business's advances are paid Responses

The account is recorded and is where advances will be sent

externalId
string · required
mask
string · required

Read a business as we hold it

GET
https://api.luxor.lunchpayments.com
/v1/organizations/{externalId}

Reports the three gates a business must clear before it can borrow: compliance, a signed agreement, and a connected bank account. They are independent of each other and can be cleared in any order.

taxIdOnFile is a yes or no rather than the number. It answers the question you need answered, which is whether this business can clear compliance at all; the number itself belongs to the legal business, which more than one platform may serve.

Read a business as we hold itpath Parameters

externalId
string · minLength: 1 · required

Your own identifier for the business, as supplied when you synced it. You never need to store a Lunch identifier.

Your own identifier for the business, as supplied when you synced it. You never need to store a Lunch identifier.

Read a business as we hold it Responses

The business

externalId
string · required
name
string | null · required
taxIdOnFile
boolean · required
complianceRoute
string | null · enum · required

How compliance cleared, or null while it has not. PARTNER_SUPPLIED means you sent us the tax identification number and no vendor confirmed it. We may add members to this list; we never remove one or repurpose its meaning. Keep a default branch for a value you do not recognise.

Enum values:
VENDOR_ASSERTION
W9_UPLOAD
PARTNER_SUPPLIED
object · required

Create or update a business

PUT
https://api.luxor.lunchpayments.com
/v1/organizations/{externalId}

Idempotent on your own identifier, so you can replay your whole ledger without creating duplicates. A replay UPDATES the business with what you sent rather than quietly doing nothing.

Supplying a tax identification number is what lets us recognise a business you and another platform both serve as one company. Without one we deliberately do not try: guessing wrong would give two unrelated businesses a single credit limit, which is worse than a duplicate. A duplicate is harmless, because clearing compliance requires a tax id.

Sending a tax identification number clears this business's compliance step. You do not need the vendor to confirm it, and they will not be asked to. If it later turns out to be wrong, we will come back to you for a corrected one.

Create or update a businesspath Parameters

externalId
string · minLength: 1 · required

Your own identifier for the business, as supplied when you synced it. You never need to store a Lunch identifier.

Your own identifier for the business, as supplied when you synced it. You never need to store a Lunch identifier.

Create or update a business Request Body

legalName
string · minLength: 1 · required
taxId
string

The business tax identification number, punctuation optional. Omit it if you do not hold one. It is what lets us recognise a business several platforms serve as one company, and without one we deliberately do not guess.

object

Your copy of the business’s details, as your system holds them. Used to prefill onboarding before the business has told us anything, and to address an invitation. A field you omit is left as it was rather than cleared.

Create or update a business Responses

The business, as we now hold it

externalId
string · required
created
boolean · required

True when a new business was created. False covers two cases, and reason tells them apart: this identifier was already linked to you, or its tax id matched a business already on file.

reason
string · required

Why it resolved the way it did. Quotable in support.

object

What became of a tax identification number you supplied. Present only when you sent one for a business already linked to you. Absent when you sent none, and absent on a first link, where the number has already done its work deciding which business you meant and is on file either way; created and reason say which way that went.