
{/*
    SEO beyond what the frontmatter gives us: a canonical URL, Open Graph and
    Twitter cards for when this link is shared, and Organization + WebSite
    structured data so search engines can attribute the brand rather than guess
    at it. Frontmatter only produces <title> and <meta name="description">.
*/}
<Head>
  <title>Developer documentation</title>
  <link rel="canonical" href="https://docs.kwiknkap.com/en/introduction" />
  <meta property="og:type" content="website" />
  <meta property="og:site_name" content="Kwik Nkap" />
  <meta property="og:title" content="Kwik Nkap developer documentation" />
  <meta property="og:description" content="Collect MTN MoMo and Orange Money payments in XAF. Payment links, invoices and signed webhooks, on the platform businesses in Cameroon run on." />
  <meta property="og:url" content="https://docs.kwiknkap.com/en/introduction" />
  <meta property="og:locale" content="en" />
  <meta property="og:locale:alternate" content="fr" />
  <meta name="twitter:card" content="summary_large_image" />
  <meta name="twitter:title" content="Kwik Nkap developer documentation" />
  <meta name="twitter:description" content="Collect MTN MoMo and Orange Money payments in XAF. Payment links, invoices and signed webhooks." />
  <link rel="alternate" hrefLang="fr" href="https://docs.kwiknkap.com/fr/introduction" />
  <link rel="alternate" hrefLang="en" href="https://docs.kwiknkap.com/en/introduction" />
  <script type="application/ld+json">
    {JSON.stringify({
      "@context": "https://schema.org",
      "@type": "WebSite",
      name: "Kwik Nkap developer documentation",
      url: "https://docs.kwiknkap.com",
      inLanguage: ["en", "fr"],
      publisher: {
        "@type": "Organization",
        name: "Kwik Nkap",
        url: "https://kwiknkap.com",
        areaServed: "CM",
      },
    })}
  </script>
</Head>

<LandingPage
  variant="hero"
  eyebrow="Kwik Nkap"
  title="Build on the platform businesses run on"
  description="Kwik Nkap is the operating system for a business in Cameroon — selling, getting paid, verification, inventory and savings in one place. This is its programmable surface."
  actions={[
    { label: "Get started", href: "/en/getting-started" },
    { label: "API reference", href: "/en/api", variant: "outline" },
  ]}
  features={[
    {
      title: "Collect Mobile Money",
      description: "Charge an MTN MoMo or Orange Money wallet and get the outcome by webhook.",
      href: "/en/payments/overview",
    },
    {
      title: "Payment links",
      description: "Shareable hosted checkout pages, created from your own systems.",
      href: "/en/products/payment-links",
    },
    {
      title: "Invoices",
      description: "Itemised bills with a hosted pay page, a PDF, and delivery by email or WhatsApp.",
      href: "/en/products/invoices",
    },
    {
      title: "Signed webhooks",
      description: "Told when money moves, retried across three days, verifiable in four lines.",
      href: "/en/payments/webhooks",
    },
  ]}
/>

## Start here

Three steps to your first payment. Nothing to install.

```bash title="Charge a customer"
curl -X POST https://api.kwiknkap.com/v1/payments \
  -H "X-API-Key: kn_sk_test_..." \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{ "amount": 5000, "phone_number": "237670000001", "payment_method": "mobile_money" }'
```

That returns `PENDING`, not paid — the customer approves on their phone, and you hear back by webhook. It is the one idea worth understanding before you write anything else, and it takes two minutes: [How a payment works](/en/concepts/how-payments-work).

- **[Get started](/en/getting-started)** — account, key, first payment, in three steps
- **[Choosing how to collect](/en/collections/overview)** — direct charge, link, invoice or storefront
- **[Build with an AI agent](/en/build-with-ai)** — llms.txt, MCP and prompts that produce correct code

## What the platform does

| | What it gives you |
| --- | --- |
| **Getting paid** | Mobile Money collections, [payment links](/en/products/payment-links), [invoices](/en/products/invoices), [storefronts and event ticketing](/en/products/storefronts) |
| **Knowing who you deal with** | [Identity and business verification](/en/products/kyc), powered by [Kwik ID](/en/products/kwik-id) |
| **Running the business** | [Inventory](/en/products/inventory) tied to what you actually sell, and [Nudle](/en/products/nudle) for restaurants |
| **Keeping what you earn** | [Savings](/en/products/savings) that set aside a share of every collection automatically |

You can run all of it from the dashboard at [app.kwiknkap.com](https://app.kwiknkap.com) without writing code. This documentation is for driving it from your own systems instead.

Money is the part everything else hangs off, so that is where the API started. Mobile Money reaches almost everyone here and cards reach almost nobody, which makes being excellent at MTN MoMo and Orange Money the ground the platform stands on rather than a feature of it.

## What you can build today

| Resource | What you can do |
| --- | --- |
| [Payments](/en/api/direct-payments) | Charge a customer's Mobile Money wallet, then read the outcome |
| [Payment links](/en/api/payment-links) | Create, update, deactivate and delete shareable checkout pages |
| [Invoices](/en/api/invoices) | Raise, publish, send, cancel, and fetch the PDF |
| [Files](/en/api/files) | Upload artwork for links and invoices, straight to storage |
| Webhooks | Be told when money moves, signed and retried for three days |

Seventeen operations, one authentication scheme, one set of [failure codes](/en/concepts/errors).

The rest of the platform — inventory, savings, verification — is live in the dashboard and not yet callable. As it becomes callable it arrives under the same conventions: same key, same idempotency, same error shape. Nothing you write today gets rewritten.

## Base URL

<ApiBaseUrl />

## Authentication

One secret key per environment, sent as `X-API-Key`. The prefix decides which environment you reach: `kn_sk_test_…` is sandbox, `kn_sk_live_…` is live, and no header or account switch overrides it. See [Environments and API keys](/en/concepts/environments-and-keys).

Keys are created in the dashboard under Developers and shown once.

:::tip
`Authorization: Bearer <key>` and `api-key: <key>` also work, but `X-API-Key` is canonical. There is no publishable key and no key pair — one secret per environment, which is why it must never reach a browser or a mobile app.
:::

## Amounts

Whole XAF francs, as integers, minimum `100`. No minor units and no multiplier: to charge 25,000 XAF, send `25000`.
