KashierDevelopersKashier Developers
Accept payments

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.

Full parameter and response reference → List payment links.

Parameters

Headers

KeyDescription
AuthorizationThe 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.

Full parameter and response reference → Get payment link details.

Headers

KeyDescription
AuthorizationThe 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.

Full parameter and response reference → Create a payment link.

Headers

KeyDescription
AuthorizationThe 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"
}'

Bulk uploading payment links consists of two steps:

  1. Upload the data for review using the /import endpoint.
  2. 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:

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

KeyDescription
AuthorizationThe 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"
}

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

KeyDescription
AuthorizationThe 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.

Full parameter and response reference → Update payment link.

Headers

KeyDescription
AuthorizationThe 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 }
          ]
      }
  }'

Full parameter and response reference → Delete payment link.

Headers

KeyDescription
AuthorizationThe 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'

Full parameter and response reference → Share payment link.

Headers

KeyDescription
AuthorizationThe 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

KeyRequiredDescription
operationyesemail or phone — how the link is delivered.
keyyesThe email address or phone number to send it to.
urlIdentifieryesThe payment link's identifier, in the PL-… form returned by Create a payment link — not the internal _id.
countryCodenoCountry 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.

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:

KeyDescription
emailAddress to send the export to.
branchIdsComma-separated branch IDs to export.

The export takes no request body — the filters above are the whole request.

Headers

KeyDescription
AuthorizationThe 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&currency=EGP'
--header 'Authorization: YOUR_TEST_SECRET_KEY'

Full parameter and response reference → Export payment links.

Mark as paid

Full parameter and response reference → Pay with a card token, or mark a payment link as paid.

Headers

KeyDescription
AuthorizationThe 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

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
}

On this page