Lumeo Docs
Getting Started

Quickstart

Create your first payout in sandbox — from API key to settled transaction.

This walks through creating a single cross-border payout in sandbox, end to end. You'll call two endpoints — initiate then confirm — and see a webhook fire when the payment settles.

Get a sandbox API key

Open Settings → Developers → API Keys in the Lumeo portal. Click New key, select Sandbox, and copy the key. It is shown only once and is prefixed sk_sandbox_.

Set it as an environment variable so you don't paste it inline:

export LUMEO_API_KEY=sk_sandbox_...

Initiate a payout

POST /payments/initiate records the payout intent. It does not move funds yet.

curl -X POST https://api-sandbox.lumeo.co.in/api/v1/payments/initiate \
  -H "Authorization: Bearer $LUMEO_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": 500.00,
    "currency": "USD",
    "destinationAddress": "GTEST_SUCCESS_ADDR_XXXXXXXXXXXXXXXXXX",
    "purposeCode": "P0801",
    "invoiceRef": "invoice-2026-0001"
  }'
import { LumeoClient } from "@lumeo/sdk";
import { randomUUID } from "crypto";

const lumeo = new LumeoClient({ apiKey: process.env.LUMEO_API_KEY! });

const payment = await lumeo.payments.initiate({
  amount: 500.0,
  currency: "USD",
  destinationAddress: "GTEST_SUCCESS_ADDR_XXXXXXXXXXXXXXXXXX",
  purposeCode: "P0801",
  invoiceRef: "invoice-2026-0001",
}, { idempotencyKey: randomUUID() });

console.log(payment.id);     // clx1a2b3c...
console.log(payment.status); // "INITIATED"

You get back a payment id with status: "INITIATED". Save this ID — you need it for the next step.

Confirm the payout

POST /payments/confirm triggers compliance checks and queues the payout for execution.

curl -X POST https://api-sandbox.lumeo.co.in/api/v1/payments/confirm \
  -H "Authorization: Bearer $LUMEO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "clx1a2b3c4d5e6f7g8h9",
    "destinationAddress": "GTEST_SUCCESS_ADDR_XXXXXXXXXXXXXXXXXX",
    "amount": "500.00",
    "currency": "USD",
    "vaultId": "your-vault-id"
  }'

The payment moves to COMPLIANCE_CHECK, then PROCESSING, then CONFIRMED within a few seconds in sandbox.

Receive the webhook

Register a webhook endpoint (e.g. using ngrok locally) and subscribe to payout.settled:

curl -X POST https://api-sandbox.lumeo.co.in/api/v1/webhooks \
  -H "Authorization: Bearer $LUMEO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://your-handler.example.com/webhooks/lumeo",
    "events": ["payout.settled", "fira.generated"]
  }'

When the payout settles, Lumeo POSTs to your URL:

{
  "id": "evt_01j4abc",
  "type": "payout.settled",
  "createdAt": "2026-07-01T09:14:28.000Z",
  "data": {
    "paymentId": "clx1a2b3c4d5e6f7g8h9",
    "status": "CONFIRMED",
    "amount": 500.00,
    "currency": "USD",
    "firaId": "fira_01j4abc"
  }
}

Fetch the auto-generated FIRA

A Foreign Inward Remittance Advice is generated automatically for every confirmed cross-border payout. Fetch it using the firaId from the webhook:

curl https://api-sandbox.lumeo.co.in/api/v1/compliance/fira/fira_01j4abc \
  -H "Authorization: Bearer $LUMEO_API_KEY"

What just happened

You just ran the full compliance flow: money initiated → compliance checked → settled → FIRA generated. In production, this sequence completes for real cross-border payouts with real INR settlement.

Next steps

On this page