# Introduction
Source: https://paylinky.vercel.app/docs/introduction

What Paylinky is and the two ways to accept payments.

# Welcome to Paylinky

Paylinky lets African businesses accept **Mobile Money** and **crypto** payments with a single integration. Paylinky routes payments through licensed payment partners, adds KYC-verified merchant accounts, a unified wallet, signed webhooks and a real sandbox.

## Two ways to integrate

| | Hosted Page API | Direct API (SDK) |
| - | - | - |
| What you build | Almost nothing — redirect the customer to a Paylinky checkout link | Your own checkout UI, forms and flows |
| Endpoint | `POST /api/v1/payment-links` | `POST /api/v1/collect`, `POST /api/v1/crypto/collect` |
| Customer experience | Paylinky-hosted page (country, operator, phone, OTP, crypto QR) | Fully branded by you |
| Best for | Invoices, WhatsApp/SMS links, quick launches | Apps, marketplaces, custom checkouts |

You can use both with the same API key.

## Base URL

```text
https://paylinky.vercel.app/api/v1
```

All requests and responses are JSON. All endpoints require `Authorization: Bearer <key>` (see [Authentication](/docs/authentication)).

## Environments

| Environment | Key prefix | Money moves? | Activation |
| - | - | - | - |
| Sandbox | `plk_test_…` | No — simulated | Instant |
| Live | `plk_live_…` | Yes | Requires approved KYC **and** manual activation by the Paylinky team |

## Conventions

- **Amounts** are numbers in the currency's main unit (e.g. `1000` XAF). Crypto amounts are USDT.
- **References.** Every payment has a Paylinky `reference` (e.g. `PLK-7XK2M9QPLA`) and your optional `merchant_reference`.
- **Statuses:** `pending`, `success`, `failed`, `cancelled`, `expired`, `refunded`.
- **Errors** use `{ "error": "code", "message": "Human readable" }` — see [Errors](/docs/errors).
- **Idempotency:** re-sending a request with the same `reference` returns the existing payment (`idempotent_replay: true`) instead of creating a duplicate.

:::tip
Never trust the browser to confirm a payment. Deliver goods only after a `payment.completed` webhook or a server-side `GET /transaction/{id}` that returns `success`.
:::
