> ## Documentation Index
> Fetch the complete documentation index at: https://docs.payluk.ng/llms.txt
> Use this file to discover all available pages before exploring further.

# Introduction

> Accept escrow-protected payments with a single API call.

The **Payluk RESTFUL API** lets your platform create escrow payment links,
hold funds securely, and release them when both sides are satisfied — for
one-off purchases or multi-stage projects.

A typical integration looks like this:

<Steps>
  <Step title="Create an escrow">
    Generate a payment link for a sale. Payluk returns a `paymentToken` you can
    share with the buyer.
  </Step>

  <Step title="Buyer funds the escrow">
    The buyer pays into escrow. Funds are held — not yet released to the seller.
  </Step>

  <Step title="Delivery & confirmation">
    Once the buyer confirms delivery (or each milestone), the corresponding
    funds are released to the seller, net of fees.
  </Step>

  <Step title="Disputes, if any">
    Either party can open a dispute. As the merchant, you resolve it by
    releasing to the seller or refunding the buyer.
  </Step>
</Steps>

## Base URL

All requests are made to one of the following hosts, and every route is mounted
under `/v1`.

<CodeGroup>
  ```bash Staging theme={null}
  https://staging.api.payluk.ng
  ```

  ```bash Production theme={null}
  https://api.payluk.ng
  ```
</CodeGroup>

<Info>
  Use **staging** with `sk_test_` keys while you build. It mirrors production
  behaviour and adds test-only helpers such as
  [Top up virtual account](/api-reference/payments/top-up-virtual-account-staging-only).
</Info>

## The standard envelope

Every response — success or error — uses the same envelope:

```json theme={null}
{
  "status": 200,
  "message": "Operation successful",
  "data": {}
}
```

| Field     | Description                                                        |
| --------- | ------------------------------------------------------------------ |
| `status`  | The HTTP status code, repeated in the body.                        |
| `message` | A human-readable summary. On errors, this is the reason.           |
| `data`    | The result payload — an object, an array, or `{}` for empty/error. |

## What you can build

<CardGroup cols={2}>
  <Card title="Standard escrow" icon="lock" href="/concepts/escrow-lifecycle">
    Single-payment escrow links released on delivery confirmation.
  </Card>

  <Card title="Milestone escrow" icon="list-check" href="/concepts/milestone-escrows">
    Fund a project upfront and release it in parts as milestones complete.
  </Card>

  <Card title="Merchant customers" icon="users" href="/concepts/merchant-customers">
    Onboard buyers and sellers and act on their behalf.
  </Card>

  <Card title="Payments & wallets" icon="wallet" href="/api-reference/payments/create-payment-intent">
    Fund wallets, verify references and generate virtual accounts.
  </Card>

  <Card title="Inline Checkout SDK" icon="js" href="/sdk/introduction">
    Drop a hosted escrow checkout widget into your web app with a publishable key.
  </Card>

  <Card title="Escrow webhooks" icon="bell" href="/concepts/webhooks">
    Get signed callbacks at your URL whenever an escrow changes state.
  </Card>
</CardGroup>

Ready to make your first call? Head to the [Quickstart](/quickstart), or see
every endpoint in order in [How it works (end-to-end)](/concepts/how-it-works).
