---
title: "Initialise payment link"
method: POST
path: "/v1/pay/initialize"
tags: ["Payment Links"]
---

# Initialise payment link

`POST /v1/pay/initialize`

## Request

- Base URL: `https://api.kyshi.co`
- URL: `https://api.kyshi.co/v1/pay/initialize`
- Auth: API key in header `x-api-key`
- TypeScript: <https://skmtc.dev/kyshi/apis/kyshi-mor-public-api/docs/v1/pay/initialize/post.ts> (a function with typed inputs; its response is checked against the schema)

Creates a hosted checkout URL for one customer and one amount. Create links server-side: a link created in the browser is a link whose amount the customer can change.

## Request body

- InitiatePaymentLinkIntegrationDto
  - `customer` CustomerInput, required
    - `firstName` string, required
    - `lastName` string, required
    - `email` string, required
    - `customerCode` string, required
    - `phoneNumber` string, required
    - `integrationId` string, required
    - `metadata` string, required
    - `riskAction` string, required
    - `internationalFormatPhone` string, required
  - `expiresAt` string, required: ISO 8601 expiration date of the payment link
  - `localCurrency` 'NGN' | 'KES' | 'ZAR' | 'GHS' | 'XOF' | 'USD', required: Local currency the customer will pay in
  - `description` string, required: Payment description shown to the customer
  - `metadata` IntegrationMetadataInput[], required: Line items for the payment link
    - `name` string, required: Item or service name
    - `amount` number, required: Amount in the merchant settlement currency (e.g USD)
    - `quantity` number, required: Quantity of the item
  - `feeBearer` 'MERCHANT' | 'CUSTOMER': Who bears platform fees
  - `taxChargeable` 'INCLUSIVE' | 'EXCLUSIVE': Tax behavior if tax is enabled
  - `taxEnabled` boolean: Enable Stripe automatic tax for USD payment links

## Response `201`

Success.

- object
  - `status` boolean, required: `true` on success.
  - `message` string, required
  - `code` number, required: Mirrors the HTTP status code.
  - `data` object, required: The endpoint-specific payload.
    - `id` string, required
    - `reference` string
    - `link` string
    - `paymentLink` string
    - `amount` number
    - `currency` string
    - `status` string
    - `customer` object
    - `createdAt` string

## Other responses

- `400`: Missing or invalid request parameter.
- `401`: No valid API key provided.
- `403`: The API key lacks permission for this request.
- `404`: Resource not found. A 404 on an object you just created is usually a test/live mode mismatch.
- `422`: Business rule failure, such as an unsupported currency or insufficient balance.
- `500`: Something went wrong on Kyshi’s end.

## Changes

- **2026-11-03** `4aed77604588`: 3 breaking, 8 warning, 9 info
  - added `#/components/schemas/CustomerInput` to the `customer` request property `allOf` list
  - the `customer` request property type changed from `object` to no type
  - the response's body type changed from `object` to no type for status `201`
  - removed the request property `customer/email`
  - …16 more

[Operation history](https://skmtc.dev/kyshi/apis/kyshi-mor-public-api/changes/v1/pay/initialize/post.md)

---

[API](https://skmtc.dev/kyshi/apis/kyshi-mor-public-api.md) - [All operations](https://skmtc.dev/kyshi/apis/kyshi-mor-public-api/llms.txt) - [OpenAPI document](https://skmtc.dev/kyshi/apis/kyshi-mor-public-api/revisions/4aed77604588?raw)
