Payment links
Create and share payment links without an integration
Create and share payment links your customers can open and pay — no integration required. This API lets you:
- Create customer-specific links — one link per customer.
- Create links in bulk — generate links for many customers at once.
- Use currency conversion — create links in a foreign "virtual" currency (e.g.
USD_VIRTUAL) that settles in EGP; the customer pays the EGP equivalent at the applicable exchange rate. Requires the currency conversion feature to be enabled on your account.
Get all payment links
| Endpoint | Value |
|---|---|
| TEST-URL | https://test-api.kashier.io/v2/payment-link |
| LIVE-URL | https://api.kashier.io/v2/payment-link |
| Method | GET |
Full parameter and response reference → List payment links.
Parameters
| Parameter | Type | Description |
|---|---|---|
| currency | Query Parameter | Filter based on currency (example: EGP). If the currency conversion feature is enabled on your account, you can also filter by a virtual currency view code (example: USD_VIRTUAL) to get payment links created in that foreign currency. |
| state | Query Parameter | Payment link state. |
| startDueDate | Query Parameter | Start due date. |
| endDueDate | Query Parameter | End due date. |
| startAmountRange | Query Parameter | Start amount range. |
| endAmountRange | Query Parameter | End amount range. |
| startDate | Query Parameter | Start date. |
| endDate | Query Parameter | End date. |
| paymentStatus | Query Parameter | Payment state (example: PAID, UNPAID, OVERDUE, EXPIRED). |
| paymentType | Query Parameter | Payment type (example: FIXED_AMOUNT, ITEMIZED). |
| search | Query Parameter | Search for a payment link by its id (example: PL-2348668602). |
| page | Query Parameter | Current page number (used for pagination). |
| limit | Query Parameter | Number of items per page (used for pagination). |
Headers
| Key | Description |
|---|---|
| Authorization | The Authorization is a secret key that is used to identify the merchant. You can obtain it from Kashier's dashboard. Learn more about Authorization. |
curl --location 'https://test-api.kashier.io/v2/payment-link?
currency=EGP&state=&startAmountRange=&endAmountRange=&paymentStatus=paid&search=&page=1&limit=10'
--header 'Authorization: YOUR_TEST_SECRET_KEY'
--header 'Accept: application/json'Full parameter and response reference → Get all payment links.
The virtual currency fields (virtualAmount, virtualCurrency, etc.) and exchangeRateServiceAvailable only apply to currency conversion payment links.
Get payment link details
| Endpoint | Value |
|---|---|
| TEST-URL | https://test-api.kashier.io/v2/payment-link/:paymentLinkId |
| LIVE-URL | https://api.kashier.io/v2/payment-link/:paymentLinkId |
| Method | GET |
Full parameter and response reference → Get payment link details.
Headers
| Key | Description |
|---|---|
| Authorization | The Authorization is a secret key that is used to identify the merchant. You can obtain it from Kashier's dashboard. Learn more about Authorization. |
curl --location 'https://test-api.kashier.io/v2/payment-link/:paymentLinkId'
--header 'Authorization: YOUR_TEST_SECRET_KEY'
--header 'Accept: application/json'Full parameter and response reference → Get payment link details.
The virtual currency fields are null unless the link was created with a currency conversion currency.
Create a payment link
| Endpoint | Value |
|---|---|
| TEST-URL | https://test-api.kashier.io/v2/payment-link |
| LIVE-URL | https://api.kashier.io/v2/payment-link |
| Method | POST |
Full parameter and response reference → Create a payment link.
Headers
| Key | Description |
|---|---|
| Authorization | The Authorization is a secret key that is used to identify the merchant. You can obtain it from Kashier's dashboard. Learn more about Authorization. |
curl --location 'https://test-api.kashier.io/v2/payment-link'
--header 'Content-Type: application/json'
--header 'Authorization: YOUR_TEST_SECRET_KEY'
--data '{
"customer":{
"name":"John Doe"
},
"totalAmount": 200,
"description": "",
"isManualCapture": false,
"paymentType": "simple",
"currency": "EGP",
"state": "submitted",
"extraFees": [
{
"name": "VAT",
"flatFee": 0,
"rate": 5
},
{
"name": "annualFee",
"flatFee": 500,
"rate": 0
}
],
"dueDate":"2027-12-27T21:59:00.000Z",
"isSuspendedPayment": false,
"referenceId":"123ss456"
}'Full parameter and response reference → Create a payment link.
Currency conversion
Set currency to a virtual currency code (USD_VIRTUAL, EUR_VIRTUAL, GBP_VIRTUAL, SAR_VIRTUAL, AED_VIRTUAL) with totalAmount expressed in that currency to collect payment in a foreign currency while settling in EGP.
Important
Requires the currency conversion feature — contact Kashier's backoffice/support to enable it. Without it, a virtual currency returns a 400: "Currency conversion feature is not enabled."
curl --location 'https://test-api.kashier.io/v2/payment-link'
--header 'Content-Type: application/json'
--header 'Authorization: YOUR_TEST_SECRET_KEY'
--data '{
"customer":{
"name":"John Doe"
},
"totalAmount": 40,
"description": "",
"isManualCapture": false,
"paymentType": "simple",
"currency": "USD_VIRTUAL",
"state": "submitted",
"extraFees": [],
"isSuspendedPayment": false,
"referenceId":"123ss456"
}'Payment links bulk upload
Bulk uploading payment links consists of two steps:
- Upload the data for review using the /import endpoint.
- Save the data if it is valid using the correlationId returned from the /import step.
- If errors are found in the data, they will be returned for correction.
- If validation passes, the API returns a correlationId.
- The correlationId serves as a reference to your validated data.
Uploading the sheet for review
First, you need to upload the Excel sheet for review:
| Endpoint | Value |
|---|---|
| TEST-URL | https://test-api.kashier.io/v2/paymentRequest/import?currency=EGP |
| LIVE-URL | https://api.kashier.io/v2/paymentRequest/import?currency=EGP |
| Method | POST |
Replace currency=EGP with a virtual currency code (e.g. currency=USD_VIRTUAL) to bulk-upload payment links in a foreign currency — see currency conversion. This requires the currency conversion feature to be enabled on your account.
Headers
| Key | Description |
|---|---|
| Authorization | The Authorization is a secret key that is used to identify the merchant. You can obtain it from Kashier's dashboard. Learn more about Authorization. |
curl 'https://test-api.kashier.io/v2/paymentRequest/import?currency=EGP'
-X POST
-H 'Authorization: YOUR_TEST_SECRET_KEY'
-H 'Access-Control-Allow-Origin: *'
-H 'Content-Type: multipart/form-data; boundary=----geckoformboundary9c673decdbea595725978e0df26aa91b'
--data-binary
$'------geckoformboundary9c673decdbea595725978e0df26aa91b
Content-Disposition: form-data; name="file"; filename="payment-link-temp-updated.xlsx"
Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
------geckoformboundary9c673decdbea595725978e0df26aa91b--
'Note
The Content-Type in the request header must be set to multipart/form-data, since you are uploading an Excel sheet in the request body.
Response structure
{
"body": {
"paymentRequests": [
{
"isSuspendedPayment": false,
"merchantId": "MID-XXXXX-XXX",
"storeName": "TEST-Demo",
"invoiceReferenceId": "Abc_123456",
"paymentType": "professional",
"totalAmount": "1102.50",
"availableAmountForRefund": "0.00",
"totalAmountWithoutFees": "1050.00",
"description": "",
"creationDate": "2025-08-26T10:01:58.991Z",
"dueDate": null,
"invoiceItems": [
{
"description": "product 1 name",
"quantity": "3",
"unitPrice": "100.00",
"subTotal": "300.00"
},
{
"description": "product 2 name",
"quantity": "5",
"unitPrice": "150.00",
"subTotal": "750.00"
}
],
"customerName": "Ahmed Mohamed",
"extraFees": [
{
"name": "Fee1 Name",
"flatFee": 0,
"rate": 2
},
{
"name": "Fee 2 name",
"flatFee": 10,
"rate": 0
},
{
"name": "vat",
"flatFee": 0,
"rate": 5
}
],
"currency": "EGP",
"state": "submitted",
"paymentStatus": "unpaid",
"paymentRequestId": "INV-24358575125",
"paymentLinkId": "PL-24358575125",
"merchantInfo": {
"storeName": "TEST-Demo"
},
"createdByUserId": "5f8d0d55b54764421b7156c3",
"isPaymentLink": true,
"isBulkCreated": true,
"referenceId": "Abc_123456",
"labels": [
"Label 1",
" Label 2",
" Label 3"
],
"errors": null
}
],
"correlationId": "508cf034-447a-4a14-8154-09b50c14a6c6"
},
"message": "Imported successfully"
}Saving the uploaded payment links
If the uploaded data passes validation during the review step, you can save it to the database using the correlationId returned in the /import response.
Full parameter and response reference → Save bulk-uploaded payment links.
Headers
| Key | Description |
|---|---|
| Authorization | The Authorization is a secret key that is used to identify the merchant. You can obtain it from Kashier's dashboard. Learn more about Authorization. |
The request carries no body — the correlationId from the import step identifies the validated rows, and operation=save says what to do with them.
curl 'https://test-api.kashier.io/v2/paymentRequest/saveInvoice?correlationId=:correlationId&operation=save'
-X POST
-H 'Accept: application/json, text/plain, */*'
-H 'Authorization: YOUR_TEST_SECRET_KEY'Full parameter and response reference → Save the uploaded payment links.
Update a payment link
| Endpoint | Value |
|---|---|
| TEST-URL | https://test-api.kashier.io/v2/payment-link/paymentLinkId |
| LIVE-URL | https://api.kashier.io/v2/payment-link/paymentLinkId |
| Method | PUT |
Full parameter and response reference → Update payment link.
Headers
| Key | Description |
|---|---|
| Authorization | The Authorization is a secret key that is used to identify the merchant. You can obtain it from Kashier's dashboard. Learn more about Authorization. |
curl --location --request PUT 'https://test-api.kashier.io/v2/payment-link/{{paymentLinkId}}'
--header 'Authorization: YOUR_TEST_SECRET_KEY'
--header 'Content-Type: application/json'
--data '{
"paymentLink":{
"customer":{
"name":"John doe"
},
"totalAmount": 200,
"description": "",
"isManualCapture": false,
"paymentType": "simple",
"currency": "EGP",
"state": "submitted",
"extraFees": [
{ "name": "tax", "flatFee": 0, "rate": 5 },
{ "name": "taxen", "flatFee": 0, "rate": 10 }
]
}
}'Delete a payment link
| Endpoint | Value |
|---|---|
| TEST-URL | https://test-api.kashier.io/v2/payment-link/paymentLinkId |
| LIVE-URL | https://api.kashier.io/v2/payment-link/paymentLinkId |
| Method | DELETE |
Full parameter and response reference → Delete payment link.
Headers
| Key | Description |
|---|---|
| Authorization | The Authorization is a secret key that is used to identify the merchant. You can obtain it from Kashier's dashboard. Learn more about Authorization. |
curl --location --request DELETE 'https://test-api.kashier.io/v2/payment-link/{{paymentLinkId}}'
--header 'Authorization: YOUR_TEST_SECRET_KEY'Share a payment link
| Endpoint | Value |
|---|---|
| TEST-URL | https://test-api.kashier.io/v2/payment-link/share |
| LIVE-URL | https://api.kashier.io/v2/payment-link/share |
| Method | POST |
Full parameter and response reference → Share payment link.
Headers
| Key | Description |
|---|---|
| Authorization | The Authorization is a secret key that is used to identify the merchant. You can obtain it from Kashier's dashboard. Learn more about Authorization. |
curl --location 'https://test-api.kashier.io/v2/payment-link/share'
--header 'Authorization: YOUR_TEST_SECRET_KEY'
--header 'Content-Type: application/json'
--data-raw '{
"operation": "email",// sms, email
"urlIdentifier": "PL-ABC123DEF456",
"key": "[email protected]"
}'Body parameters
| Key | Required | Description |
|---|---|---|
operation | yes | email or phone — how the link is delivered. |
key | yes | The email address or phone number to send it to. |
urlIdentifier | yes | The payment link's identifier, in the PL-… form returned by Create a payment link — not the internal _id. |
countryCode | no | Country code for phone, in +XXX form (for example +20). |
This panel sends a real message
Replace both urlIdentifier and key below before sending — PL-ABC123DEF456 is a placeholder and will be rejected, and a valid link plus a real address genuinely emails or texts the recipient.
Full parameter and response reference → Share a payment link.
Export payment links
| Endpoint | Value |
|---|---|
| TEST-URL | https://test-api.kashier.io/v2/payment-link/export |
| LIVE-URL | https://api.kashier.io/v2/payment-link/export |
| Method | POST |
Full parameter and response reference → Export payment links.
The export arrives by email
This endpoint does not stream a file back. It queues the export and emails it — the response only acknowledges that the email was sent. Requires the payment-link export permission on your key.
Query parameters
The export takes the same filters as Get all payment links, narrowing which links end up in the file, plus:
| Key | Description |
|---|---|
email | Address to send the export to. |
branchIds | Comma-separated branch IDs to export. |
The export takes no request body — the filters above are the whole request.
Headers
| Key | Description |
|---|---|
| Authorization | The Authorization is a secret key that is used to identify the merchant. You can obtain it from Kashier's dashboard. Learn more about Authorization. |
curl --location --request POST 'https://test-api.kashier.io/v2/payment-link/export?limit=20&page=1&sortType=-1&paymentType=all¤cy=EGP'
--header 'Authorization: YOUR_TEST_SECRET_KEY'Full parameter and response reference → Export payment links.
Mark as paid
| Endpoint | Value |
|---|---|
| TEST-URL | https://test-fep.kashier.io/v3/orders |
| LIVE-URL | https://fep.kashier.io/v3/orders |
| Method | POST |
Full parameter and response reference → Pay with a card token, or mark a payment link as paid.
Headers
| Key | Description |
|---|---|
| Authorization | The Authorization is a secret key that is used to identify the merchant. You can obtain it from Kashier's dashboard. Learn more about Authorization. |
curl --location 'https://test-fep.kashier.io/v3/orders'
--header 'Authorization: YOUR_TEST_SECRET_KEY'
--header 'Content-Type: application/json'
--data '
{
"order":{
"reference":"67c59e14e626cf0012fdb9de",
"amount":65,
"currency":"EGP"
},
"origin":{
"id":"PL-XXXXXXXXXX"
},
"apiOperation":"PAY",
"interactionSource":"ECOMMERCE",
"paymentMethod":{
"type":"cash"
},
"metaData":{
"kashierOriginType":"paymentLink",
"kashierOriginDetails":{
"name":"",
"id":"PL-XXXXXXXXXX",
"customerName":"bashar",
"createdUserId":"5f8d0d55b54764421b7156c3"
}
}
}'No 'Try it' panel for this one
Every identifier in this body has to come from your own account — the PL-… link ID in origin.id, the order reference, and the createdUserId of the dashboard user recording the payment. There's no placeholder set that produces a valid request, so a runnable panel here would only ever return a 400 — "This request is invalid". Fill the values above into the curl and run it against your own test account instead. Note that a successful call records a real cash payment against the link and moves it to paid.
Body description
| Key | Description |
|---|---|
| order.reference | A unique identifier for the order (e.g., "6773fa351652132156d37f7b"). |
| order.amount | The total amount of the order (e.g., 200). |
| order.currency | The currency in which the transaction is processed (e.g., 'EGP' for Egyptian Pounds). |
| origin.id | A unique identifier for the origin of the payment request, such as an invoice number (e.g., "INV-2334424102"). |
| apiOperation | Specifies the operation being performed. 'PAY' indicates that this is a payment request. |
| interactionSource | Defines where the payment is initiated from. "ECOMMERCE" indicates that the payment is processed online via an e-commerce platform. |
| paymentMethod | The payment method type (e.g., "cash"). |
| metaData.kashierOriginType | The type of origin associated with the payment (e.g., "paymentLink"). |
| metaData.kashierOriginDetails.id | The unique identifier of the origin (e.g., "PL-2435857557"). |
| metaData.kashierOriginDetails.customerName | The name of the customer associated with this payment (e.g., "John doe"). |
| metaData.kashierOriginDetails.createdUserId | The user ID of the person who created this transaction (e.g., "5f8d0d55b54764421b7156c3"). |
Response structure
{
"response":{
"apiOperation":"PAY",
"operation":"pay",
"currency":"EGP",
"result":"SUCCESS",
"status":"SUCCESS",
"authorizationNumber":"",
"authentication":{
},
"paymentMethod":{
"type":"cash"
},
"metaData":{
"kashierOriginType":"paymentLink",
"kashierOriginDetails":{
"name":"",
"id":"PL-XXXXXXXXXX",
"customerName":"John",
"createdUserId":"5f8d0d55b54764421b7156c3"
},
"termsAndConditions":{
"ip":"197.37.122.82"
},
"kashier_user":{
"id":"5f8d0d55b54764421b7156c3",
"fullName":"John Doe",
"email":"[email protected]",
"selectedMID":"MID-XXXXX-XXX"
},
"merchantWebhook":"https://your-website.com/kashier-webhook"
},
"origin":{
"name":"",
"id":"PL-XXXXXXXXXX",
"customerName":"John Doe",
"createdUserId":"5f8d0d55b54764421b7156c3"
},
"reconciliation":{
"webhookUrl":"<Kashier internal notification endpoint>",
"redirect":false
},
"merchantId":"MID-XXXXX-XXX",
"order":{
"amount":65,
"currency":"EGP",
"systemOrderId":"d2e68974-5a5c-48eb-8f5f-6bd54ccbe830",
"reference":"67c59e14e626cf0012fdb9de"
},
"amount":65,
"totalRefundedAmount":0,
"totalCapturedAmount":65,
"totalAuthorizedAmount":65,
"method":"cash",
"creationDate":"2025-03-03T14:20:27.492Z",
"orderId":"d2e68974-5a5c-48eb-8f5f-6bd54ccbe830",
"provider":"cash",
"merchantOrderId":"67c59e14e626cf0012fdb9de",
"orderReference":"TEST-ORD-193387945",
"paymentType":"paymentLink",
"interactionSource":"Online",
"device":{
"ipAddress":"197.37.122.82"
},
"transactionId":"TX-24358575179",
"transactionResponseCode":"00",
"transactionResponseMessage":{
"en":"Approved",
"ar":"تمت الموافقة"
}
},
"messages":{
"en":"Approved",
"ar":"تمت الموافقة"
},
"status":"SUCCESS",
"showCaptcha":false
}