Kaspi QR payments (Kazakhstan) via Qut Pay: create invoices, check status, refund, sandbox tests.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Bearer <Qut Pay API key: qp_test_… sandbox or qp_live_…>
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Returns the organization behind the API key: mode (sandbox or live), tariff and limits, connected Kaspi cashiers, provider status. Call this first.
This tool takes no arguments.
Returns the organization behind the API key: mode (sandbox or live), tariff and limits, connected Kaspi cashiers, provider status. Call this first.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}Closes a pending invoice. A QR may still be paid until expiresAt — then invoice.paid arrives anyway; handle it.
| Argument | Type | Description |
|---|---|---|
| id* | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"minLength": 1
}
},
"additionalProperties": false
}Creates an invoice (QR by default, or pushed to the customer's Kaspi.kz app with kind="phone"). Returns payUrl (hosted pay page), qrImageUrl, deepLink, expiresAt (~3 min). Always pass idempotencyKey (e.g. "order-1001") so a retry never creates a second invoice. Amount in KZT, ≤ 2 decimals; whole tenge for kind="phone".
| Argument | Type | Description |
|---|---|---|
| kind | string | "qr" (default) or "phone" (invoice pushed into the customer's Kaspi.kz app; needs customer.phone) |
| amount* | number | Amount in KZT, e.g. 2500 or 1500.5 |
| failUrl | string | |
| customer | object | |
| metadata | object | Returned unchanged in webhooks |
| successUrl | string | |
| description | string | Shown to the customer, e.g. "Order #1001" |
| idempotencyKey | string | Unique per order; same key → same invoice |
| externalOrderId | string | Your order id; later GET /invoices?externalOrderId finds it |
Reads one invoice by id (inv_…). live=true asks Kaspi right now instead of the cached status. Status flow: new → pending → paid | failed | expired | cancelled; paid → partially_refunded → refunded.
| Argument | Type | Description |
|---|---|---|
| id* | string | |
| live | boolean |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"live": {
"type": "boolean"
}
},
"additionalProperties": false
}Reads a recurring invoice schedule by id (sub_…). Needs the subscriptions:manage scope.
| Argument | Type | Description |
|---|---|---|
| id* | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"minLength": 1
}
},
"additionalProperties": false
}Lists invoices of the organization, newest first. Filter by status, externalOrderId, date range (ISO), limit ≤ 50, offset for paging.
| Argument | Type | Description |
|---|---|---|
| to | string | ISO date/time, exclusive |
| from | string | ISO date/time, inclusive |
| limit | integer | |
| offset | integer | |
| status | string | |
| externalOrderId | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"to": {
"type": "string",
"description": "ISO date/time, exclusive"
},
"from": {
"type": "string",
"description": "ISO date/time, inclusive"
},
"limit": {
"type": "integer",
"maximum": 50,
"minimum": 1
},
"offset": {
"type": "integer",
"minimum": 0
},
"status": {
"enum": [
"new",
"pending",
"paid",
"failed",
"expired",
"cancelled",
"partially_refunded",
"refunded"
],
"type": "string"
},
"externalOrderId": {
"type": "string"
}
},
"additionalProperties": false
}Read-only list of recurring invoice schedules. Needs the subscriptions:manage scope on the key.
| Argument | Type | Description |
|---|---|---|
| limit | integer | |
| status | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"type": "integer",
"maximum": 50,
"minimum": 1
},
"status": {
"enum": [
"active",
"paused",
"cancelled"
],
"type": "string"
}
},
"additionalProperties": false
}Full refund (omit amount) or partial refund of a paid invoice. Needs the refunds:write scope. With a LIVE key real money is returned to the customer, so confirm=true is required and the merchant must have asked for this refund explicitly.
| Argument | Type | Description |
|---|---|---|
| id* | string | |
| amount | number | Omit for a full refund |
| reason | string | |
| confirm | boolean | Required (true) with a live key |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"amount": {
"type": "number",
"description": "Omit for a full refund",
"exclusiveMinimum": 0
},
"reason": {
"type": "string",
"maxLength": 255
},
"confirm": {
"type": "boolean",
"description": "Required (true) with a live key"
}
},
"additionalProperties": false
}Completes a sandbox invoice as paid / failed / expired without Kaspi, so the whole flow including the merchant's webhook can be tested. Refuses to run with a live key.
| Argument | Type | Description |
|---|---|---|
| id* | string | |
| status | string | Default "paid" |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"status": {
"enum": [
"paid",
"failed",
"expired"
],
"type": "string",
"description": "Default \"paid\""
}
},
"additionalProperties": false
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"amount"
],
"properties": {
"kind": {
"enum": [
"qr",
"phone"
],
"type": "string",
"description": "\"qr\" (default) or \"phone\" (invoice pushed into the customer's Kaspi.kz app; needs customer.phone)"
},
"amount": {
"type": "number",
"description": "Amount in KZT, e.g. 2500 or 1500.5",
"exclusiveMinimum": 0
},
"failUrl": {
"type": "string",
"format": "uri"
},
"customer": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"email": {
"type": "string",
"format": "email"
},
"phone": {
"type": "string",
"pattern": "^7\\d{10}$",
"description": "7XXXXXXXXXX"
}
},
"additionalProperties": false
},
"metadata": {
"type": "object",
"description": "Returned unchanged in webhooks",
"additionalProperties": {}
},
"successUrl": {
"type": "string",
"format": "uri"
},
"description": {
"type": "string",
"maxLength": 255,
"description": "Shown to the customer, e.g. \"Order #1001\""
},
"idempotencyKey": {
"type": "string",
"maxLength": 120,
"minLength": 1,
"description": "Unique per order; same key → same invoice"
},
"externalOrderId": {
"type": "string",
"maxLength": 120,
"description": "Your order id; later GET /invoices?externalOrderId finds it"
}
},
"additionalProperties": false
}