What you can do
- Collect and pay out - fund a payment from a bank account (ACH) or a card, and deliver it on the rail that fits the payee.
- Choose the speed per payment - standard or fast delivery, decided on each payment.
- Pay any business - payees don’t onboard to Melio to get paid.
- Stay compliant by default - KYC, KYB, and sanctions screening run underneath every payment.
- Track everything - subscribe to webhooks for the full payment lifecycle.
Core concepts
A handful of resources make up every integration. Each has an opaque, prefixed id that is stable for the life of the resource.
A payment moves money from one internal account (the debit side) to one external account (the credit side), on behalf of an entity. A payment can’t be created until the entity is payment-eligible - check the limitations endpoint to see what an entity is allowed to do.
Base URLs and environments
Melio provides separate environments for testing and live money movement. Both are versioned under/v2.
Authentication
Authenticate every request with your API key, sent in theapi-key header. Keep your key secret - never expose it in client-side code or commit it to source control.
Authentication
How to authenticate requests, manage keys, and work across environments.
Entity context
Most requests operate on a specific entity and require theMelio-Entity-Id header - either an entity id (ent_<uuid>) or the sentinel me, which resolves to the partner’s sole entity (handy for direct partners).
Requests and responses
- The API speaks JSON - send
Content-Type: application/jsonand read JSON responses. - All monetary amounts are in minor units (cents). For example,
125000represents $1,250.00. Currency defaults to USD. - Resource ids are opaque and prefixed (
ent_,acct_,pay_). Treat them as strings; never parse or construct them. externalId- attach your own unique identifier to any resource, then look it up with?externalId=(unique per partner per resource type; reusing one returns409 DUPLICATE_EXTERNAL_ID).metadata- free-form string key/value pairs Melio stores and returns verbatim but never interprets. Filterable viametadata[key]=value.
Always calculate amounts in cents on your server before sending them to the API. Avoid floating-point arithmetic - represent dollars as integers in your data model and multiply by 100 only at serialization time.
Idempotency
Send anIdempotency-Key header on creates so retries are safe: the original response is replayed instead of creating a second resource. It’s required on POST /payments. Keys are retained 24 hours per partner.
Pagination
List endpoints are cursor-paginated and return newest-first. The envelope is{ "data": [ ... ], "hasMore": true }. Page with limit (1-50, default 50) plus a cursor - startingAfter=<id> for the next (older) page, endingBefore=<id> for the previous (newer) one. Keep going until hasMore is false.
Getting started
The typical integration follows these steps:1
Onboard the entity
POST /entities to create the business (organization plus owner). Melio runs KYC/KYB; check GET /limitations to confirm it’s payment-eligible.2
Add an internal account
Register the account funds are pulled from - a bank account (via Plaid or account/routing) or a card - with
POST /accounts.3
Add an external account
Add the payee (ACH, check, domestic wire, or virtual card) with
POST /accounts.4
Create a payment
POST /payments referencing the internal and external accounts, amount, deductionDate, and deliveryPreference. Send an Idempotency-Key. Melio returns the estimated delivery date.5
Track it
Subscribe to webhooks to follow the payment through its lifecycle and know when it’s delivered.
6
Reconcile
Map Melio resources back to your own records using
externalId and metadata.Before creating a payment you can pre-flight it with the Tools endpoints:
POST /tools/fee-calculator, POST /tools/fast-payment-eligibility, and POST /tools/delivery-eta - no resource is created.Payment lifecycle
After creation, a payment moves through the following states:PATCH /payments/{id}) or cancel (POST /payments/{id}/cancel) a payment while it’s scheduled. Once it moves to in-progress it’s locked (409 PAYMENT_NOT_EDITABLE / PAYMENT_NOT_CANCELABLE). A payment under risk review is still reported as scheduled - there’s no separate review status.
Authentication
Authenticate requests and manage your API keys.
Payments
Amounts, dates, delivery preferences, and the full payment lifecycle.
Webhooks
Subscribe to lifecycle events and reconcile in real time.