{
  "brand": "Kevmi",
  "version": "2026-10-23.13",
  "updatedAt": "2026-10-23",
  "articles": [
    {
      "id": "quickstart",
      "title": "Quick start",
      "summary": "Explore your workspace, set up your store and see an invoice as your customer will see it. This guide takes you through the main steps in order.",
      "group": "start",
      "url": "/docs/quickstart",
      "tags": [
        "start",
        "setup",
        "first payment",
        "quick start"
      ],
      "sections": [
        {
          "id": "explore",
          "title": "1. Explore the product",
          "paragraphs": [
            "Open the demo workspace to create a test order, explore payment links and check a fee calculation. The demo uses separate test data. It does not create a bank payment or transfer funds to a wallet."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Open the demo workspace",
              "href": "/demo/index.html"
            },
            {
              "label": "Preview checkout",
              "href": "/pay/demo"
            }
          ]
        },
        {
          "id": "account",
          "title": "2. Create an account with Telegram",
          "paragraphs": [
            "After Telegram sign-in, the merchant account opens. Website onboarding is at /account#applications; both the form and individual tracking at /account#applications/{id} stay inside the app.",
            "A new payment and card intent require the merchant’s latest website-review application to be approved. Approval alone does not connect the payment gateway. If the review changes after dispatch, the existing operation remains available for status reads, reconciliation and a requested bank code."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Open your account",
              "href": "/account"
            }
          ]
        },
        {
          "id": "settings",
          "title": "3. Set up your store",
          "paragraphs": [],
          "bullets": [],
          "steps": [
            "Choose a store name your customer will recognize.",
            "Choose a default VAT rule. Each new invoice separately accepts customer fee and VAT shares from 0 to 100%.",
            "Select the notifications you want to receive in Telegram.",
            "Use the calculator to check a typical order amount."
          ],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Calculate fees and VAT",
              "href": "/pricing"
            }
          ]
        },
        {
          "id": "invoice",
          "title": "4. Prepare a payment link",
          "paragraphs": [
            "Enter a clear order title, an amount and a currency. The customer gets a dedicated page with purchase details and the total due. An existing invoice keeps its original terms when your store settings change."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Payment links guide",
              "href": "/docs/payment-links"
            }
          ]
        },
        {
          "id": "activate",
          "title": "5. Check payment availability",
          "paragraphs": [
            "Manage invoices, API keys, widgets and webhooks from your account. Before payment, Kevmi checks the gateway configuration, merchant approval, amount and invoice terms. If the selected method is unavailable, checkout explains why.",
            "For a new invoice in the interface, USD offers cards and Alipay; RUB offers SBP; USDT offers crypto. The API can also save USD + crypto for compatibility, but its live crypto payment is blocked with crypto_requires_usdt. USD and USDT are distinct, with no automatic conversion or assumed 1:1 rate. A crypto payment requires a separate USDT invoice.",
            "For a new live card or Alipay payment, the current gateway supports only feeCustomerPercent=0 and vatCustomerPercent=100: the merchant covers the entire processing fee and VAT is added in full for the customer. Other shares can be saved and calculated on an invoice, but execution is blocked with unsupported_allocation. The server never silently changes saved terms. SBP and USDT crypto payments support every processing-fee share and have no VAT."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "Creating an invoice, key or application does not charge money. Payout creation through the API is unavailable; withdrawal terms are covered in a separate guide.",
          "links": [
            {
              "label": "Gateway integration requirements",
              "href": "/docs/gateway"
            }
          ]
        }
      ],
      "body": "Explore your workspace, set up your store and see an invoice as your customer will see it. This guide takes you through the main steps in order.\n\n1. Explore the product\n\nOpen the demo workspace to create a test order, explore payment links and check a fee calculation. The demo uses separate test data. It does not create a bank payment or transfer funds to a wallet.\n\nOpen the demo workspace: https://kevmi.one/demo/index.html?lang=en\n\nPreview checkout: https://kevmi.one/en/pay/demo\n\n2. Create an account with Telegram\n\nAfter Telegram sign-in, the merchant account opens. Website onboarding is at /account#applications; both the form and individual tracking at /account#applications/{id} stay inside the app.\n\nA new payment and card intent require the merchant’s latest website-review application to be approved. Approval alone does not connect the payment gateway. If the review changes after dispatch, the existing operation remains available for status reads, reconciliation and a requested bank code.\n\nOpen your account: https://kevmi.one/en/account\n\n3. Set up your store\n\n1. Choose a store name your customer will recognize.\n\n2. Choose a default VAT rule. Each new invoice separately accepts customer fee and VAT shares from 0 to 100%.\n\n3. Select the notifications you want to receive in Telegram.\n\n4. Use the calculator to check a typical order amount.\n\nCalculate fees and VAT: https://kevmi.one/en/pricing\n\n4. Prepare a payment link\n\nEnter a clear order title, an amount and a currency. The customer gets a dedicated page with purchase details and the total due. An existing invoice keeps its original terms when your store settings change.\n\nPayment links guide: https://kevmi.one/en/docs/payment-links\n\n5. Check payment availability\n\nManage invoices, API keys, widgets and webhooks from your account. Before payment, Kevmi checks the gateway configuration, merchant approval, amount and invoice terms. If the selected method is unavailable, checkout explains why.\n\nFor a new invoice in the interface, USD offers cards and Alipay; RUB offers SBP; USDT offers crypto. The API can also save USD + crypto for compatibility, but its live crypto payment is blocked with crypto_requires_usdt. USD and USDT are distinct, with no automatic conversion or assumed 1:1 rate. A crypto payment requires a separate USDT invoice.\n\nFor a new live card or Alipay payment, the current gateway supports only feeCustomerPercent=0 and vatCustomerPercent=100: the merchant covers the entire processing fee and VAT is added in full for the customer. Other shares can be saved and calculated on an invoice, but execution is blocked with unsupported_allocation. The server never silently changes saved terms. SBP and USDT crypto payments support every processing-fee share and have no VAT.\n\nCreating an invoice, key or application does not charge money. Payout creation through the API is unavailable; withdrawal terms are covered in a separate guide.\n\nGateway integration requirements: https://kevmi.one/en/docs/gateway",
      "readMinutes": 3
    },
    {
      "id": "overview",
      "title": "How Kevmi works",
      "summary": "Kevmi brings individual invoices, payment methods and pricing rules into one workspace. Every order is paid separately. There are no subscriptions or automatic recurring charges.",
      "group": "start",
      "url": "/docs/overview",
      "tags": [
        "overview",
        "one-time payments",
        "workspace",
        "no subscriptions"
      ],
      "sections": [
        {
          "id": "roles",
          "title": "The merchant and the customer",
          "paragraphs": [
            "The merchant sets an order title, base price, currency and tax allocation. The customer opens a dedicated checkout page, chooses an available method and sees the total before confirming.",
            "The customer does not need access to the merchant workspace. Checkout exposes the details of one order, not the store balance, settings or other customer records."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "channels",
          "title": "Four payment channels",
          "paragraphs": [],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Method",
              "Audience",
              "Acceptance fee"
            ],
            "rows": [
              [
                "International cards",
                "International customers",
                "10% + $0.50; 16% VAT"
              ],
              [
                "SBP",
                "Customers in Russia",
                "8%; no VAT"
              ],
              [
                "Alipay",
                "Customers in China",
                "10% + $0.50; 16% VAT"
              ],
              [
                "Cryptocurrency",
                "Crypto payments",
                "4%; no VAT"
              ]
            ]
          },
          "code": null,
          "note": "Visa and Mastercard are available in more than 190 countries, except the published restrictions. Cryptocurrency is available in all countries.",
          "links": [
            {
              "label": "Countries and restrictions",
              "href": "/docs/geography"
            }
          ]
        },
        {
          "id": "workspace",
          "title": "Inside your workspace",
          "paragraphs": [
            "Server records belong to the verified account. The demo is separate and cannot create live payments or a withdrawable balance."
          ],
          "bullets": [
            "Payment links and order terms: /account#links.",
            "Website applications and individual tracking: /account#applications.",
            "API keys, webhooks, widget and events: /account#keys, #webhooks, #widget, #events.",
            "Pricing, calculator, country map and full documentation: /account#knowledge.",
            "Store settings, Telegram notifications and support requests stay in the same account."
          ],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "money",
          "title": "Understanding the amounts",
          "paragraphs": [
            "The base price is the price of the goods or service before cost allocation. The fee and VAT use that base independently. Customer shares are added to checkout; merchant shares are deducted from the base price. Card and Alipay VAT is 16%, with fee and VAT allocation controlled separately.",
            "Kevmi’s platform commission is already included in the published fees. There is no additional 5% surcharge. A USDT TRC20 payout has a separate fee based on the source of funds and an explicit conversion quote."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "All fees",
              "href": "/pricing"
            }
          ]
        },
        {
          "id": "availability",
          "title": "Access to features",
          "paragraphs": [
            "Documentation, the calculator and the documentation assistant are available without sign-in. Store settings, payment links and private support requests require an account. Financial availability is checked separately, and an unavailable payment channel is reported before a charge."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        }
      ],
      "body": "Kevmi brings individual invoices, payment methods and pricing rules into one workspace. Every order is paid separately. There are no subscriptions or automatic recurring charges.\n\nThe merchant and the customer\n\nThe merchant sets an order title, base price, currency and tax allocation. The customer opens a dedicated checkout page, chooses an available method and sees the total before confirming.\n\nThe customer does not need access to the merchant workspace. Checkout exposes the details of one order, not the store balance, settings or other customer records.\n\nFour payment channels\n\nMethod · Audience · Acceptance fee\nInternational cards · International customers · 10% + $0.50; 16% VAT\nSBP · Customers in Russia · 8%; no VAT\nAlipay · Customers in China · 10% + $0.50; 16% VAT\nCryptocurrency · Crypto payments · 4%; no VAT\n\nVisa and Mastercard are available in more than 190 countries, except the published restrictions. Cryptocurrency is available in all countries.\n\nCountries and restrictions: https://kevmi.one/en/docs/geography\n\nInside your workspace\n\nServer records belong to the verified account. The demo is separate and cannot create live payments or a withdrawable balance.\n\nPayment links and order terms: /account#links.\n\nWebsite applications and individual tracking: /account#applications.\n\nAPI keys, webhooks, widget and events: /account#keys, #webhooks, #widget, #events.\n\nPricing, calculator, country map and full documentation: /account#knowledge.\n\nStore settings, Telegram notifications and support requests stay in the same account.\n\nUnderstanding the amounts\n\nThe base price is the price of the goods or service before cost allocation. The fee and VAT use that base independently. Customer shares are added to checkout; merchant shares are deducted from the base price. Card and Alipay VAT is 16%, with fee and VAT allocation controlled separately.\n\nKevmi’s platform commission is already included in the published fees. There is no additional 5% surcharge. A USDT TRC20 payout has a separate fee based on the source of funds and an explicit conversion quote.\n\nAll fees: https://kevmi.one/en/pricing\n\nAccess to features\n\nDocumentation, the calculator and the documentation assistant are available without sign-in. Store settings, payment links and private support requests require an account. Financial availability is checked separately, and an unavailable payment channel is reported before a charge.",
      "readMinutes": 3
    },
    {
      "id": "fees",
      "title": "Payment and payout fees",
      "summary": "The acceptance fee depends on the payment method and uses the order base price. Kevmi’s commission is included. VAT and payout fees are shown separately.",
      "group": "payments",
      "url": "/docs/fees",
      "tags": [
        "fees",
        "pricing",
        "cost",
        "payout",
        "commission"
      ],
      "sections": [
        {
          "id": "incoming",
          "title": "Accepting one payment",
          "paragraphs": [
            "Add the percentage and fixed components. For a $5 card order, the fee is $0.50 + $0.50 = $1. VAT is $0.80 and is separate from this fee.",
            "The platform share, approximately 5% on average, is already built into these terms. Do not add a second platform percentage."
          ],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Method",
              "Percentage",
              "Fixed fee",
              "VAT"
            ],
            "rows": [
              [
                "International cards",
                "10%",
                "$0.50",
                "16% of the base price"
              ],
              [
                "Alipay",
                "10%",
                "$0.50",
                "16% of the base price"
              ],
              [
                "SBP",
                "8%",
                "None",
                "None"
              ],
              [
                "Cryptocurrency",
                "4%",
                "None",
                "None"
              ]
            ]
          },
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "payout",
          "title": "Withdrawing funds",
          "paragraphs": [
            "The source of funds and payout network are separate settings. Using TRC20 does not make every payout fee the same. The payout fee is separate from the acceptance fee.",
            "Keep the fixed fee in its stated currency. Do not deduct RUB 400 from a USD amount or assume $3 equals 3 USDT. The final payout requires an explicit conversion quote."
          ],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Source of funds",
              "Payout fee",
              "Destination"
            ],
            "rows": [
              [
                "Cards",
                "4%",
                "USDT TRC20"
              ],
              [
                "Alipay",
                "4%",
                "USDT TRC20"
              ],
              [
                "SBP",
                "5% + RUB 400",
                "USDT TRC20"
              ],
              [
                "Cryptocurrency",
                "0% + $3",
                "USDT TRC20"
              ]
            ]
          },
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "rounding",
          "title": "Calculation precision",
          "paragraphs": [
            "Invoice amountMinor is an integer: 500 means 5.00 USD, RUB or USDT in the explicitly stated currency. These are invoice calculation units; USD and USDT are not automatically converted. Fees and VAT use separate half-up rounding.",
            "For a crypto transfer, use the exact decimal coin amount and network returned by the created operation. Do not derive the transfer amount from the rounded invoice price. A calculation cannot produce negative merchant proceeds."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": {
            "language": "Formula",
            "code": "feeMinor = roundHalfUp(baseMinor × rate / 100) + fixedMinor\nvatMinor = roundHalfUp(baseMinor × 16 / 100)\n// For SBP and cryptocurrency, vatMinor = 0"
          },
          "note": "",
          "links": []
        },
        {
          "id": "before-pay",
          "title": "Check before paying",
          "paragraphs": [],
          "bullets": [
            "The original order amount and currency.",
            "The payment method, which determines the fee and whether VAT applies.",
            "The VAT payer saved with the invoice.",
            "The customer total and expected merchant credit."
          ],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Calculate your amount",
              "href": "/pricing"
            },
            {
              "label": "Understand VAT",
              "href": "/docs/vat"
            }
          ]
        }
      ],
      "body": "The acceptance fee depends on the payment method and uses the order base price. Kevmi’s commission is included. VAT and payout fees are shown separately.\n\nAccepting one payment\n\nAdd the percentage and fixed components. For a $5 card order, the fee is $0.50 + $0.50 = $1. VAT is $0.80 and is separate from this fee.\n\nThe platform share, approximately 5% on average, is already built into these terms. Do not add a second platform percentage.\n\nMethod · Percentage · Fixed fee · VAT\nInternational cards · 10% · $0.50 · 16% of the base price\nAlipay · 10% · $0.50 · 16% of the base price\nSBP · 8% · None · None\nCryptocurrency · 4% · None · None\n\nWithdrawing funds\n\nThe source of funds and payout network are separate settings. Using TRC20 does not make every payout fee the same. The payout fee is separate from the acceptance fee.\n\nKeep the fixed fee in its stated currency. Do not deduct RUB 400 from a USD amount or assume $3 equals 3 USDT. The final payout requires an explicit conversion quote.\n\nSource of funds · Payout fee · Destination\nCards · 4% · USDT TRC20\nAlipay · 4% · USDT TRC20\nSBP · 5% + RUB 400 · USDT TRC20\nCryptocurrency · 0% + $3 · USDT TRC20\n\nCalculation precision\n\nInvoice amountMinor is an integer: 500 means 5.00 USD, RUB or USDT in the explicitly stated currency. These are invoice calculation units; USD and USDT are not automatically converted. Fees and VAT use separate half-up rounding.\n\nFor a crypto transfer, use the exact decimal coin amount and network returned by the created operation. Do not derive the transfer amount from the rounded invoice price. A calculation cannot produce negative merchant proceeds.\n\nfeeMinor = roundHalfUp(baseMinor × rate / 100) + fixedMinor\nvatMinor = roundHalfUp(baseMinor × 16 / 100)\n// For SBP and cryptocurrency, vatMinor = 0\n\nCheck before paying\n\nThe original order amount and currency.\n\nThe payment method, which determines the fee and whether VAT applies.\n\nThe VAT payer saved with the invoice.\n\nThe customer total and expected merchant credit.\n\nCalculate your amount: https://kevmi.one/en/pricing\n\nUnderstand VAT: https://kevmi.one/en/docs/vat",
      "readMinutes": 3
    },
    {
      "id": "vat",
      "title": "VAT and cost allocation",
      "summary": "VAT is 16% of the base order price for international cards and Alipay. The merchant sets a customer share from 0 to 100% and covers the remainder from revenue. SBP and cryptocurrency have no VAT under these published terms.",
      "group": "payments",
      "url": "/docs/vat",
      "tags": [
        "VAT",
        "tax",
        "customer",
        "merchant",
        "five dollars"
      ],
      "sections": [
        {
          "id": "base",
          "title": "One base for fees and tax",
          "paragraphs": [
            "The base price is the order amount entered by the store. The 10% + $0.50 fee and 16% VAT are calculated independently from this price. The fee does not apply to the VAT added on top.",
            "With a $5 base price, the fee is $1 and VAT is $0.80. Changing the payer changes the allocation, not the tax rate or its calculation base."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "customer",
          "title": "The customer pays VAT",
          "paragraphs": [
            "This is the default VAT rule: a 100% customer share, equivalent to the legacy customer value. The merchant covers the entire fee in this example. VAT is added to the base price. Checkout shows the order price, VAT and total due.",
            "Only the acceptance fee is deducted from the base price. For a $5 order, the customer pays $5.80 and the merchant receives $4."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": {
            "language": "Formula",
            "code": "customerTotalMinor = baseMinor + vatMinor\nmerchantNetMinor = baseMinor - feeMinor"
          },
          "note": "",
          "links": []
        },
        {
          "id": "merchant",
          "title": "The merchant pays VAT",
          "paragraphs": [
            "In this example, customer shares are 0% for both VAT and the fee. The legacy merchant VAT value corresponds to a zero customer VAT share; the merchant covers both costs from the base price.",
            "For a $5 order, the customer pays $5, the fee is $1, VAT is $0.80 and the merchant receives $3.20. VAT remains 16% of the base price; do not replace this rule with a 16/116 formula."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": {
            "language": "Formula",
            "code": "customerTotalMinor = baseMinor\nmerchantNetMinor = baseMinor - feeMinor - vatMinor"
          },
          "note": "",
          "links": []
        },
        {
          "id": "comparison",
          "title": "A side-by-side example",
          "paragraphs": [],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Amount",
              "Customer pays VAT",
              "Merchant pays VAT"
            ],
            "rows": [
              [
                "Base order price",
                "$5.00",
                "$5.00"
              ],
              [
                "Acceptance fee",
                "$1.00",
                "$1.00"
              ],
              [
                "VAT",
                "$0.80",
                "$0.80"
              ],
              [
                "Customer pays",
                "$5.80",
                "$5.00"
              ],
              [
                "Merchant receives",
                "$4.00",
                "$3.20"
              ]
            ]
          },
          "code": null,
          "note": "Both columns assume a 0% customer processing-fee share. Intermediate VAT shares and separate fee allocation are available in the calculator.",
          "links": []
        },
        {
          "id": "snapshot",
          "title": "When the setting applies",
          "paragraphs": [
            "The store preference supplies the initial allocation. The interface and API save independent integer customer VAT and processing-fee shares from 0 to 100 for each invoice. Changes to store settings do not recalculate issued invoices.",
            "For a new live card or Alipay payment, the current gateway supports only feeCustomerPercent=0 and vatCustomerPercent=100: the merchant covers the entire processing fee and VAT is added in full for the customer. Other shares can be saved and calculated on an invoice, but execution is blocked with unsupported_allocation. The server never silently changes saved terms. SBP and USDT crypto payments support every processing-fee share and have no VAT.",
            "Create a new link for different terms. VAT is zero for SBP and cryptocurrency."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Store settings",
              "href": "/docs/settings"
            },
            {
              "label": "Check the calculation",
              "href": "/pricing"
            },
            {
              "label": "Split processing fees and VAT",
              "href": "/docs/cost-sharing"
            }
          ]
        }
      ],
      "body": "VAT is 16% of the base order price for international cards and Alipay. The merchant sets a customer share from 0 to 100% and covers the remainder from revenue. SBP and cryptocurrency have no VAT under these published terms.\n\nOne base for fees and tax\n\nThe base price is the order amount entered by the store. The 10% + $0.50 fee and 16% VAT are calculated independently from this price. The fee does not apply to the VAT added on top.\n\nWith a $5 base price, the fee is $1 and VAT is $0.80. Changing the payer changes the allocation, not the tax rate or its calculation base.\n\nThe customer pays VAT\n\nThis is the default VAT rule: a 100% customer share, equivalent to the legacy customer value. The merchant covers the entire fee in this example. VAT is added to the base price. Checkout shows the order price, VAT and total due.\n\nOnly the acceptance fee is deducted from the base price. For a $5 order, the customer pays $5.80 and the merchant receives $4.\n\ncustomerTotalMinor = baseMinor + vatMinor\nmerchantNetMinor = baseMinor - feeMinor\n\nThe merchant pays VAT\n\nIn this example, customer shares are 0% for both VAT and the fee. The legacy merchant VAT value corresponds to a zero customer VAT share; the merchant covers both costs from the base price.\n\nFor a $5 order, the customer pays $5, the fee is $1, VAT is $0.80 and the merchant receives $3.20. VAT remains 16% of the base price; do not replace this rule with a 16/116 formula.\n\ncustomerTotalMinor = baseMinor\nmerchantNetMinor = baseMinor - feeMinor - vatMinor\n\nA side-by-side example\n\nAmount · Customer pays VAT · Merchant pays VAT\nBase order price · $5.00 · $5.00\nAcceptance fee · $1.00 · $1.00\nVAT · $0.80 · $0.80\nCustomer pays · $5.80 · $5.00\nMerchant receives · $4.00 · $3.20\n\nBoth columns assume a 0% customer processing-fee share. Intermediate VAT shares and separate fee allocation are available in the calculator.\n\nWhen the setting applies\n\nThe store preference supplies the initial allocation. The interface and API save independent integer customer VAT and processing-fee shares from 0 to 100 for each invoice. Changes to store settings do not recalculate issued invoices.\n\nFor a new live card or Alipay payment, the current gateway supports only feeCustomerPercent=0 and vatCustomerPercent=100: the merchant covers the entire processing fee and VAT is added in full for the customer. Other shares can be saved and calculated on an invoice, but execution is blocked with unsupported_allocation. The server never silently changes saved terms. SBP and USDT crypto payments support every processing-fee share and have no VAT.\n\nCreate a new link for different terms. VAT is zero for SBP and cryptocurrency.\n\nStore settings: https://kevmi.one/en/docs/settings\n\nCheck the calculation: https://kevmi.one/en/pricing\n\nSplit processing fees and VAT: https://kevmi.one/en/docs/cost-sharing",
      "readMinutes": 4
    },
    {
      "id": "geography",
      "title": "Countries and payment methods",
      "summary": "Visa and Mastercard cover more than 190 countries, except the published restrictions. SBP serves Russia, Alipay serves China, and cryptocurrency is available worldwide.",
      "group": "payments",
      "url": "/docs/geography",
      "tags": [
        "countries",
        "coverage",
        "190+",
        "Russia",
        "China",
        "Åland Islands",
        "Albania",
        "Algeria",
        "American Samoa",
        "Andorra",
        "Angola",
        "Anguilla",
        "Antigua & Barbuda",
        "Argentina",
        "Armenia",
        "Aruba",
        "Australia",
        "Austria",
        "Azerbaijan",
        "Bahamas",
        "Bahrain",
        "Bangladesh",
        "Barbados",
        "Belgium",
        "Belize",
        "Benin",
        "Bermuda",
        "Bhutan",
        "Bolivia",
        "Caribbean Netherlands",
        "Bosnia & Herzegovina",
        "Botswana",
        "Bouvet Island",
        "Brazil",
        "British Indian Ocean Territory",
        "Brunei",
        "Bulgaria",
        "Burkina Faso",
        "Cape Verde",
        "Cambodia",
        "Cameroon",
        "Canada",
        "Cayman Islands",
        "Chile",
        "China",
        "Christmas Island",
        "Cocos (Keeling) Islands",
        "Colombia",
        "Comoros",
        "Cook Islands",
        "Costa Rica",
        "Croatia",
        "Curaçao",
        "Cyprus",
        "Czechia",
        "Côte d’Ivoire",
        "Denmark",
        "Djibouti",
        "Dominica",
        "Dominican Republic",
        "Ecuador",
        "Egypt",
        "El Salvador",
        "Equatorial Guinea",
        "Estonia",
        "Eswatini",
        "Ethiopia",
        "Falkland Islands",
        "Faroe Islands",
        "Micronesia",
        "Fiji",
        "Finland",
        "France",
        "French Guiana",
        "French Polynesia",
        "French Southern Territories",
        "Gabon",
        "Gambia",
        "Georgia",
        "Germany",
        "Ghana",
        "Gibraltar",
        "Greece",
        "Greenland",
        "Grenada",
        "Guadeloupe",
        "Guam",
        "Guatemala",
        "Guernsey",
        "Guinea",
        "Guinea-Bissau",
        "Guyana",
        "Heard & McDonald Islands",
        "Vatican City",
        "Honduras",
        "Hong Kong SAR China",
        "Hungary",
        "Iceland",
        "India",
        "Indonesia",
        "Ireland",
        "Isle of Man",
        "Israel",
        "Italy",
        "Jamaica",
        "Japan",
        "Jersey",
        "Jordan",
        "Kazakhstan",
        "Kenya",
        "Kiribati",
        "Kuwait",
        "Kyrgyzstan",
        "Laos",
        "Latvia",
        "Lebanon",
        "Lesotho",
        "Liberia",
        "Liechtenstein",
        "Lithuania",
        "Luxembourg",
        "Macao SAR China",
        "Madagascar",
        "Malawi",
        "Malaysia",
        "Maldives",
        "Malta",
        "Marshall Islands",
        "Martinique",
        "Mauritania",
        "Mauritius",
        "Mayotte",
        "Mexico",
        "Moldova",
        "Monaco",
        "Mongolia",
        "Montenegro",
        "Montserrat",
        "Morocco",
        "Mozambique",
        "Namibia",
        "Nauru",
        "Nepal",
        "Netherlands",
        "New Caledonia",
        "New Zealand",
        "Niger",
        "Nigeria",
        "Niue",
        "Norfolk Island",
        "North Macedonia",
        "Northern Mariana Islands",
        "Norway",
        "Oman",
        "Pakistan",
        "Palau",
        "Panama",
        "Papua New Guinea",
        "Paraguay",
        "Peru",
        "Philippines",
        "Pitcairn Islands",
        "Poland",
        "Portugal",
        "Puerto Rico",
        "Qatar",
        "Romania",
        "Rwanda",
        "Réunion",
        "St. Barthélemy",
        "St. Helena",
        "St. Kitts & Nevis",
        "St. Lucia",
        "St. Martin",
        "St. Pierre & Miquelon",
        "St. Vincent & Grenadines",
        "Samoa",
        "San Marino",
        "São Tomé & Príncipe",
        "Saudi Arabia",
        "Senegal",
        "Serbia",
        "Seychelles",
        "Sierra Leone",
        "Singapore",
        "Sint Maarten",
        "Slovakia",
        "Slovenia",
        "Solomon Islands",
        "South Africa",
        "South Georgia & South Sandwich Islands",
        "South Korea",
        "Spain",
        "Sri Lanka",
        "Palestinian Territories",
        "Suriname",
        "Svalbard & Jan Mayen",
        "Sweden",
        "Switzerland",
        "Taiwan",
        "Tajikistan",
        "Tanzania",
        "Thailand",
        "Timor-Leste",
        "Togo",
        "Tokelau",
        "Tonga",
        "Trinidad & Tobago",
        "Tunisia",
        "Turkmenistan",
        "Turks & Caicos Islands",
        "Tuvalu",
        "Türkiye",
        "Uganda",
        "Ukraine",
        "United Arab Emirates",
        "United Kingdom",
        "U.S. Outlying Islands",
        "United States",
        "Uruguay",
        "Uzbekistan",
        "Vanuatu",
        "Vietnam",
        "British Virgin Islands",
        "U.S. Virgin Islands",
        "Wallis & Futuna",
        "Western Sahara",
        "Zambia"
      ],
      "sections": [
        {
          "id": "coverage",
          "title": "Coverage by channel",
          "paragraphs": [],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Channel",
              "Coverage",
              "Conditions"
            ],
            "rows": [
              [
                "International cards",
                "More than 190 countries",
                "Except the restriction list and five regions of Ukraine"
              ],
              [
                "SBP",
                "Russia",
                "Availability depends on the bank and transaction"
              ],
              [
                "Alipay",
                "China",
                "Availability depends on the account and transaction"
              ],
              [
                "Cryptocurrency",
                "All countries",
                "Choose a supported coin and network"
              ]
            ]
          },
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "map",
          "title": "The interactive map",
          "paragraphs": [
            "The Geography page has a two-dimensional world map. Filters highlight the published international card countries, Russia for SBP and China for Alipay. Search by country name or ISO code to see its methods and notes.",
            "Hatching marks Ukraine because five regions are excluded from cards. The rest of Ukraine is available. Card restrictions do not apply to cryptocurrency, which is available in all countries."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Open the map",
              "href": "/countries"
            }
          ]
        },
        {
          "id": "cards",
          "title": "What the list covers",
          "paragraphs": [
            "The complete list below describes international card coverage. Merchant registration countries and payout destinations have separate conditions.",
            "Approval depends on the issuing country, bank, card type and payment channel checks. A country being listed does not guarantee approval for every card or transaction."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "restrictions",
          "title": "Visa and Mastercard restrictions",
          "paragraphs": [
            "Cards are unavailable in Crimea, Donetsk, Luhansk, Kherson and Zaporizhzhia. The rest of Ukraine is available.",
            "All other countries are available. Netherlands Antilles is preserved as a historical entry from the provider list; it does not block every modern Caribbean territory."
          ],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Code",
              "Country or territory"
            ],
            "rows": [
              [
                "AF",
                "Afghanistan"
              ],
              [
                "AQ",
                "Antarctica"
              ],
              [
                "BY",
                "Belarus"
              ],
              [
                "MM",
                "Burma (Myanmar)"
              ],
              [
                "BI",
                "Burundi"
              ],
              [
                "CF",
                "Central African Republic"
              ],
              [
                "TD",
                "Chad"
              ],
              [
                "CU",
                "Cuba"
              ],
              [
                "CD",
                "Democratic Republic of Congo"
              ],
              [
                "CG",
                "Republic of Congo"
              ],
              [
                "ER",
                "Eritrea"
              ],
              [
                "HT",
                "Haiti"
              ],
              [
                "IR",
                "Iran"
              ],
              [
                "IQ",
                "Iraq"
              ],
              [
                "LY",
                "Libya"
              ],
              [
                "ML",
                "Mali"
              ],
              [
                "NI",
                "Nicaragua"
              ],
              [
                "KP",
                "North Korea"
              ],
              [
                "RU",
                "Russia"
              ],
              [
                "SO",
                "Somalia"
              ],
              [
                "SS",
                "South Sudan"
              ],
              [
                "SD",
                "Sudan"
              ],
              [
                "SY",
                "Syria"
              ],
              [
                "VE",
                "Venezuela"
              ],
              [
                "YE",
                "Yemen"
              ],
              [
                "ZW",
                "Zimbabwe"
              ],
              [
                "UA-43",
                "Crimea (Region of Ukraine)"
              ],
              [
                "UA-14",
                "Donetsk (Region of Ukraine)"
              ],
              [
                "UA-65",
                "Kherson (Region of Ukraine)"
              ],
              [
                "UA-09",
                "Luhansk (Region of Ukraine)"
              ],
              [
                "UA-23",
                "Zaporizhzhia (Region of Ukraine)"
              ],
              [
                "AN",
                "Netherlands Antilles"
              ]
            ]
          },
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "card-list",
          "title": "Country and territory directory",
          "paragraphs": [
            "Names, ISO codes and markers come from the shared country registry. These notes apply to international cards."
          ],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "ISO",
              "Country or territory",
              "Note"
            ],
            "rows": [
              [
                "AX",
                "Åland Islands",
                "—"
              ],
              [
                "AL",
                "Albania",
                "—"
              ],
              [
                "DZ",
                "Algeria",
                "—"
              ],
              [
                "AS",
                "American Samoa",
                "—"
              ],
              [
                "AD",
                "Andorra",
                "—"
              ],
              [
                "AO",
                "Angola",
                "—"
              ],
              [
                "AI",
                "Anguilla",
                "—"
              ],
              [
                "AG",
                "Antigua & Barbuda",
                "—"
              ],
              [
                "AR",
                "Argentina",
                "—"
              ],
              [
                "AM",
                "Armenia",
                "—"
              ],
              [
                "AW",
                "Aruba",
                "—"
              ],
              [
                "AU",
                "Australia",
                "—"
              ],
              [
                "AT",
                "Austria",
                "—"
              ],
              [
                "AZ",
                "Azerbaijan",
                "—"
              ],
              [
                "BS",
                "Bahamas",
                "—"
              ],
              [
                "BH",
                "Bahrain",
                "—"
              ],
              [
                "BD",
                "Bangladesh",
                "—"
              ],
              [
                "BB",
                "Barbados",
                "—"
              ],
              [
                "BE",
                "Belgium",
                "—"
              ],
              [
                "BZ",
                "Belize",
                "—"
              ],
              [
                "BJ",
                "Benin",
                "—"
              ],
              [
                "BM",
                "Bermuda",
                "—"
              ],
              [
                "BT",
                "Bhutan",
                "—"
              ],
              [
                "BO",
                "Bolivia",
                "—"
              ],
              [
                "BQ",
                "Caribbean Netherlands",
                "—"
              ],
              [
                "BA",
                "Bosnia & Herzegovina",
                "—"
              ],
              [
                "BW",
                "Botswana",
                "—"
              ],
              [
                "BV",
                "Bouvet Island",
                "—"
              ],
              [
                "BR",
                "Brazil",
                "—"
              ],
              [
                "IO",
                "British Indian Ocean Territory",
                "—"
              ],
              [
                "BN",
                "Brunei",
                "—"
              ],
              [
                "BG",
                "Bulgaria",
                "—"
              ],
              [
                "BF",
                "Burkina Faso",
                "—"
              ],
              [
                "CV",
                "Cape Verde",
                "—"
              ],
              [
                "KH",
                "Cambodia",
                "—"
              ],
              [
                "CM",
                "Cameroon",
                "—"
              ],
              [
                "CA",
                "Canada",
                "—"
              ],
              [
                "KY",
                "Cayman Islands",
                "—"
              ],
              [
                "CL",
                "Chile",
                "—"
              ],
              [
                "CN",
                "China",
                "—"
              ],
              [
                "CX",
                "Christmas Island",
                "—"
              ],
              [
                "CC",
                "Cocos (Keeling) Islands",
                "—"
              ],
              [
                "CO",
                "Colombia",
                "—"
              ],
              [
                "KM",
                "Comoros",
                "—"
              ],
              [
                "CK",
                "Cook Islands",
                "—"
              ],
              [
                "CR",
                "Costa Rica",
                "—"
              ],
              [
                "HR",
                "Croatia",
                "—"
              ],
              [
                "CW",
                "Curaçao",
                "—"
              ],
              [
                "CY",
                "Cyprus",
                "—"
              ],
              [
                "CZ",
                "Czechia",
                "—"
              ],
              [
                "CI",
                "Côte d’Ivoire",
                "—"
              ],
              [
                "DK",
                "Denmark",
                "—"
              ],
              [
                "DJ",
                "Djibouti",
                "—"
              ],
              [
                "DM",
                "Dominica",
                "—"
              ],
              [
                "DO",
                "Dominican Republic",
                "—"
              ],
              [
                "EC",
                "Ecuador",
                "—"
              ],
              [
                "EG",
                "Egypt",
                "—"
              ],
              [
                "SV",
                "El Salvador",
                "—"
              ],
              [
                "GQ",
                "Equatorial Guinea",
                "—"
              ],
              [
                "EE",
                "Estonia",
                "—"
              ],
              [
                "SZ",
                "Eswatini",
                "—"
              ],
              [
                "ET",
                "Ethiopia",
                "—"
              ],
              [
                "FK",
                "Falkland Islands",
                "—"
              ],
              [
                "FO",
                "Faroe Islands",
                "—"
              ],
              [
                "FM",
                "Micronesia",
                "—"
              ],
              [
                "FJ",
                "Fiji",
                "—"
              ],
              [
                "FI",
                "Finland",
                "—"
              ],
              [
                "FR",
                "France",
                "—"
              ],
              [
                "GF",
                "French Guiana",
                "—"
              ],
              [
                "PF",
                "French Polynesia",
                "—"
              ],
              [
                "TF",
                "French Southern Territories",
                "—"
              ],
              [
                "GA",
                "Gabon",
                "—"
              ],
              [
                "GM",
                "Gambia",
                "—"
              ],
              [
                "GE",
                "Georgia",
                "—"
              ],
              [
                "DE",
                "Germany",
                "—"
              ],
              [
                "GH",
                "Ghana",
                "—"
              ],
              [
                "GI",
                "Gibraltar",
                "—"
              ],
              [
                "GR",
                "Greece",
                "—"
              ],
              [
                "GL",
                "Greenland",
                "—"
              ],
              [
                "GD",
                "Grenada",
                "—"
              ],
              [
                "GP",
                "Guadeloupe",
                "—"
              ],
              [
                "GU",
                "Guam",
                "—"
              ],
              [
                "GT",
                "Guatemala",
                "—"
              ],
              [
                "GG",
                "Guernsey",
                "—"
              ],
              [
                "GN",
                "Guinea",
                "—"
              ],
              [
                "GW",
                "Guinea-Bissau",
                "—"
              ],
              [
                "GY",
                "Guyana",
                "—"
              ],
              [
                "HM",
                "Heard & McDonald Islands",
                "—"
              ],
              [
                "VA",
                "Vatican City",
                "—"
              ],
              [
                "HN",
                "Honduras",
                "—"
              ],
              [
                "HK",
                "Hong Kong SAR China",
                "—"
              ],
              [
                "HU",
                "Hungary",
                "—"
              ],
              [
                "IS",
                "Iceland",
                "—"
              ],
              [
                "IN",
                "India",
                "—"
              ],
              [
                "ID",
                "Indonesia",
                "—"
              ],
              [
                "IE",
                "Ireland",
                "—"
              ],
              [
                "IM",
                "Isle of Man",
                "—"
              ],
              [
                "IL",
                "Israel",
                "—"
              ],
              [
                "IT",
                "Italy",
                "—"
              ],
              [
                "JM",
                "Jamaica",
                "—"
              ],
              [
                "JP",
                "Japan",
                "—"
              ],
              [
                "JE",
                "Jersey",
                "—"
              ],
              [
                "JO",
                "Jordan",
                "—"
              ],
              [
                "KZ",
                "Kazakhstan",
                "—"
              ],
              [
                "KE",
                "Kenya",
                "—"
              ],
              [
                "KI",
                "Kiribati",
                "—"
              ],
              [
                "KW",
                "Kuwait",
                "—"
              ],
              [
                "KG",
                "Kyrgyzstan",
                "—"
              ],
              [
                "LA",
                "Laos",
                "—"
              ],
              [
                "LV",
                "Latvia",
                "—"
              ],
              [
                "LB",
                "Lebanon",
                "—"
              ],
              [
                "LS",
                "Lesotho",
                "—"
              ],
              [
                "LR",
                "Liberia",
                "—"
              ],
              [
                "LI",
                "Liechtenstein",
                "—"
              ],
              [
                "LT",
                "Lithuania",
                "—"
              ],
              [
                "LU",
                "Luxembourg",
                "—"
              ],
              [
                "MO",
                "Macao SAR China",
                "—"
              ],
              [
                "MG",
                "Madagascar",
                "—"
              ],
              [
                "MW",
                "Malawi",
                "—"
              ],
              [
                "MY",
                "Malaysia",
                "—"
              ],
              [
                "MV",
                "Maldives",
                "—"
              ],
              [
                "MT",
                "Malta",
                "—"
              ],
              [
                "MH",
                "Marshall Islands",
                "—"
              ],
              [
                "MQ",
                "Martinique",
                "—"
              ],
              [
                "MR",
                "Mauritania",
                "—"
              ],
              [
                "MU",
                "Mauritius",
                "—"
              ],
              [
                "YT",
                "Mayotte",
                "—"
              ],
              [
                "MX",
                "Mexico",
                "—"
              ],
              [
                "MD",
                "Moldova",
                "—"
              ],
              [
                "MC",
                "Monaco",
                "—"
              ],
              [
                "MN",
                "Mongolia",
                "—"
              ],
              [
                "ME",
                "Montenegro",
                "—"
              ],
              [
                "MS",
                "Montserrat",
                "—"
              ],
              [
                "MA",
                "Morocco",
                "—"
              ],
              [
                "MZ",
                "Mozambique",
                "—"
              ],
              [
                "NA",
                "Namibia",
                "—"
              ],
              [
                "NR",
                "Nauru",
                "—"
              ],
              [
                "NP",
                "Nepal",
                "—"
              ],
              [
                "NL",
                "Netherlands",
                "—"
              ],
              [
                "NC",
                "New Caledonia",
                "—"
              ],
              [
                "NZ",
                "New Zealand",
                "—"
              ],
              [
                "NE",
                "Niger",
                "—"
              ],
              [
                "NG",
                "Nigeria",
                "—"
              ],
              [
                "NU",
                "Niue",
                "—"
              ],
              [
                "NF",
                "Norfolk Island",
                "—"
              ],
              [
                "MK",
                "North Macedonia",
                "—"
              ],
              [
                "MP",
                "Northern Mariana Islands",
                "—"
              ],
              [
                "NO",
                "Norway",
                "—"
              ],
              [
                "OM",
                "Oman",
                "—"
              ],
              [
                "PK",
                "Pakistan",
                "—"
              ],
              [
                "PW",
                "Palau",
                "—"
              ],
              [
                "PA",
                "Panama",
                "—"
              ],
              [
                "PG",
                "Papua New Guinea",
                "—"
              ],
              [
                "PY",
                "Paraguay",
                "—"
              ],
              [
                "PE",
                "Peru",
                "—"
              ],
              [
                "PH",
                "Philippines",
                "—"
              ],
              [
                "PN",
                "Pitcairn Islands",
                "—"
              ],
              [
                "PL",
                "Poland",
                "—"
              ],
              [
                "PT",
                "Portugal",
                "—"
              ],
              [
                "PR",
                "Puerto Rico",
                "—"
              ],
              [
                "QA",
                "Qatar",
                "—"
              ],
              [
                "RO",
                "Romania",
                "—"
              ],
              [
                "RW",
                "Rwanda",
                "—"
              ],
              [
                "RE",
                "Réunion",
                "—"
              ],
              [
                "BL",
                "St. Barthélemy",
                "—"
              ],
              [
                "SH",
                "St. Helena",
                "—"
              ],
              [
                "KN",
                "St. Kitts & Nevis",
                "—"
              ],
              [
                "LC",
                "St. Lucia",
                "—"
              ],
              [
                "MF",
                "St. Martin",
                "—"
              ],
              [
                "PM",
                "St. Pierre & Miquelon",
                "—"
              ],
              [
                "VC",
                "St. Vincent & Grenadines",
                "—"
              ],
              [
                "WS",
                "Samoa",
                "—"
              ],
              [
                "SM",
                "San Marino",
                "—"
              ],
              [
                "ST",
                "São Tomé & Príncipe",
                "—"
              ],
              [
                "SA",
                "Saudi Arabia",
                "—"
              ],
              [
                "SN",
                "Senegal",
                "—"
              ],
              [
                "RS",
                "Serbia",
                "—"
              ],
              [
                "SC",
                "Seychelles",
                "—"
              ],
              [
                "SL",
                "Sierra Leone",
                "—"
              ],
              [
                "SG",
                "Singapore",
                "—"
              ],
              [
                "SX",
                "Sint Maarten",
                "—"
              ],
              [
                "SK",
                "Slovakia",
                "—"
              ],
              [
                "SI",
                "Slovenia",
                "—"
              ],
              [
                "SB",
                "Solomon Islands",
                "—"
              ],
              [
                "ZA",
                "South Africa",
                "—"
              ],
              [
                "GS",
                "South Georgia & South Sandwich Islands",
                "—"
              ],
              [
                "KR",
                "South Korea",
                "—"
              ],
              [
                "ES",
                "Spain",
                "—"
              ],
              [
                "LK",
                "Sri Lanka",
                "—"
              ],
              [
                "PS",
                "Palestinian Territories",
                "—"
              ],
              [
                "SR",
                "Suriname",
                "—"
              ],
              [
                "SJ",
                "Svalbard & Jan Mayen",
                "—"
              ],
              [
                "SE",
                "Sweden",
                "—"
              ],
              [
                "CH",
                "Switzerland",
                "—"
              ],
              [
                "TW",
                "Taiwan",
                "—"
              ],
              [
                "TJ",
                "Tajikistan",
                "—"
              ],
              [
                "TZ",
                "Tanzania",
                "—"
              ],
              [
                "TH",
                "Thailand",
                "—"
              ],
              [
                "TL",
                "Timor-Leste",
                "—"
              ],
              [
                "TG",
                "Togo",
                "—"
              ],
              [
                "TK",
                "Tokelau",
                "—"
              ],
              [
                "TO",
                "Tonga",
                "—"
              ],
              [
                "TT",
                "Trinidad & Tobago",
                "—"
              ],
              [
                "TN",
                "Tunisia",
                "—"
              ],
              [
                "TM",
                "Turkmenistan",
                "—"
              ],
              [
                "TC",
                "Turks & Caicos Islands",
                "—"
              ],
              [
                "TV",
                "Tuvalu",
                "—"
              ],
              [
                "TR",
                "Türkiye",
                "—"
              ],
              [
                "UG",
                "Uganda",
                "—"
              ],
              [
                "UA",
                "Ukraine**",
                "Cards are unavailable in Crimea, Donetsk, Luhansk, Kherson and Zaporizhzhia. The rest of Ukraine is available."
              ],
              [
                "AE",
                "United Arab Emirates",
                "—"
              ],
              [
                "GB",
                "United Kingdom",
                "—"
              ],
              [
                "UM",
                "U.S. Outlying Islands",
                "—"
              ],
              [
                "US",
                "United States",
                "—"
              ],
              [
                "UY",
                "Uruguay",
                "—"
              ],
              [
                "UZ",
                "Uzbekistan",
                "—"
              ],
              [
                "VU",
                "Vanuatu",
                "—"
              ],
              [
                "VN",
                "Vietnam",
                "—"
              ],
              [
                "VG",
                "British Virgin Islands",
                "—"
              ],
              [
                "VI",
                "U.S. Virgin Islands",
                "—"
              ],
              [
                "WF",
                "Wallis & Futuna",
                "—"
              ],
              [
                "EH",
                "Western Sahara",
                "—"
              ],
              [
                "ZM",
                "Zambia",
                "—"
              ]
            ]
          },
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "crypto",
          "title": "Coins and payment networks",
          "paragraphs": [
            "The catalogue contains 16 coins and 31 coin/network pairs. One coin can be accepted on several networks: USDT on Tron and USDT on Ethereum are different transfer options. The complete list appears below.",
            "Options available for a specific invoice and their limits come from GET /api/checkout/{token}/crypto-services. This page describes supported combinations; the current gateway response determines whether a payment can be created. A reference entry alone does not make an unavailable pair payable.",
            "The merchant creates a crypto invoice in USDT, and the customer chooses an available coin and network. The created gateway operation supplies the exact coin amount, address, QR code and expiry. A USDT invoice price does not lock the exchange rate of BTC, ETH or another coin, or imply a 1:1 rate. Transfer the exact decimal amount in the payment instructions without rounding or calculating a conversion yourself.",
            "USDT TRC20 is a separate merchant payout term. It does not restrict incoming payments to Tron or mean that payout creation is available through the account or API. The payouts guide explains withdrawal terms and restrictions."
          ],
          "bullets": [],
          "steps": [
            "Open the invoice and choose cryptocurrency as the payment method.",
            "Choose a coin and an available network. The sender wallet’s network must match the network in the Kevmi payment instructions.",
            "Create the payment instructions and check the exact amount, full address and expiry. Copy the address and amount, or use the appropriate QR code.",
            "Send the specified amount on the selected network. Account for wallet or network fees so that the recipient receives the full amount shown in the instructions.",
            "Wait for a confirmed status on checkout. Sending a wallet transfer alone does not complete the order: Kevmi verifies the result through the gateway."
          ],
          "table": {
            "headers": [
              "Coin",
              "Name",
              "Networks and gateway codes"
            ],
            "rows": [
              [
                "AVAX",
                "Avalanche",
                "Avalanche C-Chain (avalanche)"
              ],
              [
                "BCH",
                "Bitcoin Cash",
                "Bitcoin Cash (bch)"
              ],
              [
                "BNB",
                "BNB",
                "BNB Smart Chain (bsc)"
              ],
              [
                "BTC",
                "Bitcoin",
                "Bitcoin (btc)"
              ],
              [
                "DAI",
                "Dai",
                "BNB Smart Chain (bsc), Ethereum (eth), Polygon PoS (polygon)"
              ],
              [
                "DASH",
                "Dash",
                "Dash (dash)"
              ],
              [
                "DOGE",
                "Dogecoin",
                "Dogecoin (doge)"
              ],
              [
                "ETH",
                "Ethereum",
                "Ethereum (eth), Arbitrum One (arbitrum), BNB Smart Chain (bsc)"
              ],
              [
                "GRAM",
                "Gram",
                "TON (ton)"
              ],
              [
                "LTC",
                "Litecoin",
                "Litecoin (ltc)"
              ],
              [
                "POL",
                "Polygon",
                "Ethereum (eth), Polygon PoS (polygon)"
              ],
              [
                "SHIB",
                "Shiba Inu",
                "Ethereum (eth)"
              ],
              [
                "TRX",
                "TRON",
                "TRON (tron)"
              ],
              [
                "USDC",
                "USD Coin",
                "Arbitrum One (arbitrum), BNB Smart Chain (bsc), Polygon PoS (polygon), Ethereum (eth), Avalanche C-Chain (avalanche)"
              ],
              [
                "USDT",
                "Tether",
                "TRON (tron), Avalanche C-Chain (avalanche), BNB Smart Chain (bsc), TON (ton), Polygon PoS (polygon), Arbitrum One (arbitrum), Ethereum (eth)"
              ],
              [
                "XMR",
                "Monero",
                "Monero (xmr)"
              ]
            ]
          },
          "code": null,
          "note": "Do not use old payment instructions after expiry. If you have already sent funds, check the same operation and contact support if needed; do not create a second payment to check the first.",
          "links": [
            {
              "label": "Checkout",
              "href": "/docs/checkout#method"
            },
            {
              "label": "Payout terms",
              "href": "/docs/payouts"
            }
          ]
        },
        {
          "id": "specific",
          "title": "Checking a specific country",
          "paragraphs": [
            "The assistant can find a country by its Russian or English name or ISO code and explain its published marker. For ** countries, specify the location you need. For China *, ask about your card.",
            "If a country is absent from the list, this knowledge base cannot confirm international card coverage. Include the country, bank and desired method in a support request. Do not send a full card number or payment secrets."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Geography",
              "href": "/countries"
            },
            {
              "label": "Ask support",
              "href": "/?support=open"
            }
          ]
        }
      ],
      "body": "Visa and Mastercard cover more than 190 countries, except the published restrictions. SBP serves Russia, Alipay serves China, and cryptocurrency is available worldwide.\n\nCoverage by channel\n\nChannel · Coverage · Conditions\nInternational cards · More than 190 countries · Except the restriction list and five regions of Ukraine\nSBP · Russia · Availability depends on the bank and transaction\nAlipay · China · Availability depends on the account and transaction\nCryptocurrency · All countries · Choose a supported coin and network\n\nThe interactive map\n\nThe Geography page has a two-dimensional world map. Filters highlight the published international card countries, Russia for SBP and China for Alipay. Search by country name or ISO code to see its methods and notes.\n\nHatching marks Ukraine because five regions are excluded from cards. The rest of Ukraine is available. Card restrictions do not apply to cryptocurrency, which is available in all countries.\n\nOpen the map: https://kevmi.one/en/countries\n\nWhat the list covers\n\nThe complete list below describes international card coverage. Merchant registration countries and payout destinations have separate conditions.\n\nApproval depends on the issuing country, bank, card type and payment channel checks. A country being listed does not guarantee approval for every card or transaction.\n\nVisa and Mastercard restrictions\n\nCards are unavailable in Crimea, Donetsk, Luhansk, Kherson and Zaporizhzhia. The rest of Ukraine is available.\n\nAll other countries are available. Netherlands Antilles is preserved as a historical entry from the provider list; it does not block every modern Caribbean territory.\n\nCode · Country or territory\nAF · Afghanistan\nAQ · Antarctica\nBY · Belarus\nMM · Burma (Myanmar)\nBI · Burundi\nCF · Central African Republic\nTD · Chad\nCU · Cuba\nCD · Democratic Republic of Congo\nCG · Republic of Congo\nER · Eritrea\nHT · Haiti\nIR · Iran\nIQ · Iraq\nLY · Libya\nML · Mali\nNI · Nicaragua\nKP · North Korea\nRU · Russia\nSO · Somalia\nSS · South Sudan\nSD · Sudan\nSY · Syria\nVE · Venezuela\nYE · Yemen\nZW · Zimbabwe\nUA-43 · Crimea (Region of Ukraine)\nUA-14 · Donetsk (Region of Ukraine)\nUA-65 · Kherson (Region of Ukraine)\nUA-09 · Luhansk (Region of Ukraine)\nUA-23 · Zaporizhzhia (Region of Ukraine)\nAN · Netherlands Antilles\n\nCountry and territory directory\n\nNames, ISO codes and markers come from the shared country registry. These notes apply to international cards.\n\nISO · Country or territory · Note\nAX · Åland Islands · —\nAL · Albania · —\nDZ · Algeria · —\nAS · American Samoa · —\nAD · Andorra · —\nAO · Angola · —\nAI · Anguilla · —\nAG · Antigua & Barbuda · —\nAR · Argentina · —\nAM · Armenia · —\nAW · Aruba · —\nAU · Australia · —\nAT · Austria · —\nAZ · Azerbaijan · —\nBS · Bahamas · —\nBH · Bahrain · —\nBD · Bangladesh · —\nBB · Barbados · —\nBE · Belgium · —\nBZ · Belize · —\nBJ · Benin · —\nBM · Bermuda · —\nBT · Bhutan · —\nBO · Bolivia · —\nBQ · Caribbean Netherlands · —\nBA · Bosnia & Herzegovina · —\nBW · Botswana · —\nBV · Bouvet Island · —\nBR · Brazil · —\nIO · British Indian Ocean Territory · —\nBN · Brunei · —\nBG · Bulgaria · —\nBF · Burkina Faso · —\nCV · Cape Verde · —\nKH · Cambodia · —\nCM · Cameroon · —\nCA · Canada · —\nKY · Cayman Islands · —\nCL · Chile · —\nCN · China · —\nCX · Christmas Island · —\nCC · Cocos (Keeling) Islands · —\nCO · Colombia · —\nKM · Comoros · —\nCK · Cook Islands · —\nCR · Costa Rica · —\nHR · Croatia · —\nCW · Curaçao · —\nCY · Cyprus · —\nCZ · Czechia · —\nCI · Côte d’Ivoire · —\nDK · Denmark · —\nDJ · Djibouti · —\nDM · Dominica · —\nDO · Dominican Republic · —\nEC · Ecuador · —\nEG · Egypt · —\nSV · El Salvador · —\nGQ · Equatorial Guinea · —\nEE · Estonia · —\nSZ · Eswatini · —\nET · Ethiopia · —\nFK · Falkland Islands · —\nFO · Faroe Islands · —\nFM · Micronesia · —\nFJ · Fiji · —\nFI · Finland · —\nFR · France · —\nGF · French Guiana · —\nPF · French Polynesia · —\nTF · French Southern Territories · —\nGA · Gabon · —\nGM · Gambia · —\nGE · Georgia · —\nDE · Germany · —\nGH · Ghana · —\nGI · Gibraltar · —\nGR · Greece · —\nGL · Greenland · —\nGD · Grenada · —\nGP · Guadeloupe · —\nGU · Guam · —\nGT · Guatemala · —\nGG · Guernsey · —\nGN · Guinea · —\nGW · Guinea-Bissau · —\nGY · Guyana · —\nHM · Heard & McDonald Islands · —\nVA · Vatican City · —\nHN · Honduras · —\nHK · Hong Kong SAR China · —\nHU · Hungary · —\nIS · Iceland · —\nIN · India · —\nID · Indonesia · —\nIE · Ireland · —\nIM · Isle of Man · —\nIL · Israel · —\nIT · Italy · —\nJM · Jamaica · —\nJP · Japan · —\nJE · Jersey · —\nJO · Jordan · —\nKZ · Kazakhstan · —\nKE · Kenya · —\nKI · Kiribati · —\nKW · Kuwait · —\nKG · Kyrgyzstan · —\nLA · Laos · —\nLV · Latvia · —\nLB · Lebanon · —\nLS · Lesotho · —\nLR · Liberia · —\nLI · Liechtenstein · —\nLT · Lithuania · —\nLU · Luxembourg · —\nMO · Macao SAR China · —\nMG · Madagascar · —\nMW · Malawi · —\nMY · Malaysia · —\nMV · Maldives · —\nMT · Malta · —\nMH · Marshall Islands · —\nMQ · Martinique · —\nMR · Mauritania · —\nMU · Mauritius · —\nYT · Mayotte · —\nMX · Mexico · —\nMD · Moldova · —\nMC · Monaco · —\nMN · Mongolia · —\nME · Montenegro · —\nMS · Montserrat · —\nMA · Morocco · —\nMZ · Mozambique · —\nNA · Namibia · —\nNR · Nauru · —\nNP · Nepal · —\nNL · Netherlands · —\nNC · New Caledonia · —\nNZ · New Zealand · —\nNE · Niger · —\nNG · Nigeria · —\nNU · Niue · —\nNF · Norfolk Island · —\nMK · North Macedonia · —\nMP · Northern Mariana Islands · —\nNO · Norway · —\nOM · Oman · —\nPK · Pakistan · —\nPW · Palau · —\nPA · Panama · —\nPG · Papua New Guinea · —\nPY · Paraguay · —\nPE · Peru · —\nPH · Philippines · —\nPN · Pitcairn Islands · —\nPL · Poland · —\nPT · Portugal · —\nPR · Puerto Rico · —\nQA · Qatar · —\nRO · Romania · —\nRW · Rwanda · —\nRE · Réunion · —\nBL · St. Barthélemy · —\nSH · St. Helena · —\nKN · St. Kitts & Nevis · —\nLC · St. Lucia · —\nMF · St. Martin · —\nPM · St. Pierre & Miquelon · —\nVC · St. Vincent & Grenadines · —\nWS · Samoa · —\nSM · San Marino · —\nST · São Tomé & Príncipe · —\nSA · Saudi Arabia · —\nSN · Senegal · —\nRS · Serbia · —\nSC · Seychelles · —\nSL · Sierra Leone · —\nSG · Singapore · —\nSX · Sint Maarten · —\nSK · Slovakia · —\nSI · Slovenia · —\nSB · Solomon Islands · —\nZA · South Africa · —\nGS · South Georgia & South Sandwich Islands · —\nKR · South Korea · —\nES · Spain · —\nLK · Sri Lanka · —\nPS · Palestinian Territories · —\nSR · Suriname · —\nSJ · Svalbard & Jan Mayen · —\nSE · Sweden · —\nCH · Switzerland · —\nTW · Taiwan · —\nTJ · Tajikistan · —\nTZ · Tanzania · —\nTH · Thailand · —\nTL · Timor-Leste · —\nTG · Togo · —\nTK · Tokelau · —\nTO · Tonga · —\nTT · Trinidad & Tobago · —\nTN · Tunisia · —\nTM · Turkmenistan · —\nTC · Turks & Caicos Islands · —\nTV · Tuvalu · —\nTR · Türkiye · —\nUG · Uganda · —\nUA · Ukraine** · Cards are unavailable in Crimea, Donetsk, Luhansk, Kherson and Zaporizhzhia. The rest of Ukraine is available.\nAE · United Arab Emirates · —\nGB · United Kingdom · —\nUM · U.S. Outlying Islands · —\nUS · United States · —\nUY · Uruguay · —\nUZ · Uzbekistan · —\nVU · Vanuatu · —\nVN · Vietnam · —\nVG · British Virgin Islands · —\nVI · U.S. Virgin Islands · —\nWF · Wallis & Futuna · —\nEH · Western Sahara · —\nZM · Zambia · —\n\nCoins and payment networks\n\nThe catalogue contains 16 coins and 31 coin/network pairs. One coin can be accepted on several networks: USDT on Tron and USDT on Ethereum are different transfer options. The complete list appears below.\n\nOptions available for a specific invoice and their limits come from GET /api/checkout/{token}/crypto-services. This page describes supported combinations; the current gateway response determines whether a payment can be created. A reference entry alone does not make an unavailable pair payable.\n\nThe merchant creates a crypto invoice in USDT, and the customer chooses an available coin and network. The created gateway operation supplies the exact coin amount, address, QR code and expiry. A USDT invoice price does not lock the exchange rate of BTC, ETH or another coin, or imply a 1:1 rate. Transfer the exact decimal amount in the payment instructions without rounding or calculating a conversion yourself.\n\nUSDT TRC20 is a separate merchant payout term. It does not restrict incoming payments to Tron or mean that payout creation is available through the account or API. The payouts guide explains withdrawal terms and restrictions.\n\n1. Open the invoice and choose cryptocurrency as the payment method.\n\n2. Choose a coin and an available network. The sender wallet’s network must match the network in the Kevmi payment instructions.\n\n3. Create the payment instructions and check the exact amount, full address and expiry. Copy the address and amount, or use the appropriate QR code.\n\n4. Send the specified amount on the selected network. Account for wallet or network fees so that the recipient receives the full amount shown in the instructions.\n\n5. Wait for a confirmed status on checkout. Sending a wallet transfer alone does not complete the order: Kevmi verifies the result through the gateway.\n\nCoin · Name · Networks and gateway codes\nAVAX · Avalanche · Avalanche C-Chain (avalanche)\nBCH · Bitcoin Cash · Bitcoin Cash (bch)\nBNB · BNB · BNB Smart Chain (bsc)\nBTC · Bitcoin · Bitcoin (btc)\nDAI · Dai · BNB Smart Chain (bsc), Ethereum (eth), Polygon PoS (polygon)\nDASH · Dash · Dash (dash)\nDOGE · Dogecoin · Dogecoin (doge)\nETH · Ethereum · Ethereum (eth), Arbitrum One (arbitrum), BNB Smart Chain (bsc)\nGRAM · Gram · TON (ton)\nLTC · Litecoin · Litecoin (ltc)\nPOL · Polygon · Ethereum (eth), Polygon PoS (polygon)\nSHIB · Shiba Inu · Ethereum (eth)\nTRX · TRON · TRON (tron)\nUSDC · USD Coin · Arbitrum One (arbitrum), BNB Smart Chain (bsc), Polygon PoS (polygon), Ethereum (eth), Avalanche C-Chain (avalanche)\nUSDT · Tether · TRON (tron), Avalanche C-Chain (avalanche), BNB Smart Chain (bsc), TON (ton), Polygon PoS (polygon), Arbitrum One (arbitrum), Ethereum (eth)\nXMR · Monero · Monero (xmr)\n\nDo not use old payment instructions after expiry. If you have already sent funds, check the same operation and contact support if needed; do not create a second payment to check the first.\n\nCheckout: https://kevmi.one/en/docs/checkout#method\n\nPayout terms: https://kevmi.one/en/docs/payouts\n\nChecking a specific country\n\nThe assistant can find a country by its Russian or English name or ISO code and explain its published marker. For ** countries, specify the location you need. For China *, ask about your card.\n\nIf a country is absent from the list, this knowledge base cannot confirm international card coverage. Include the country, bank and desired method in a support request. Do not send a full card number or payment secrets.\n\nGeography: https://kevmi.one/en/countries\n\nAsk support: https://kevmi.one/en?support=open",
      "readMinutes": 15
    },
    {
      "id": "payment-links",
      "title": "Payment links",
      "summary": "A payment link opens a dedicated order page. Customers see the seller, purchase description, available methods and total due on their phone or computer.",
      "group": "payments",
      "url": "/docs/payment-links",
      "tags": [
        "payment link",
        "invoice",
        "checkout",
        "pause",
        "order",
        "Any",
        "method selection"
      ],
      "sections": [
        {
          "id": "contents",
          "title": "What an invoice includes",
          "paragraphs": [
            "For a new invoice in the interface, USD offers cards and Alipay; RUB offers SBP; USDT offers crypto. The API can also save USD + crypto for compatibility, but its live crypto payment is blocked with crypto_requires_usdt. USD and USDT are distinct, with no automatic conversion or assumed 1:1 rate. A crypto payment requires a separate USDT invoice.",
            "Never include passwords, API keys, card details or bank codes in public descriptions. Use an order title and reference the customer recognizes."
          ],
          "bullets": [
            "Store name, an order title of up to 120 characters and a description of up to 500 characters.",
            "Base amount and an explicit USD, RUB or USDT currency.",
            "Compatible methods, separate fee and VAT shares, an order reference and link expiry.",
            "Owner responses include link.payment with the saved state of an existing operation; this is separate from the link’s availability state."
          ],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "any",
          "title": "Any — the customer chooses",
          "paragraphs": [
            "Any selects all methods compatible with the invoice currency: cards and Alipay for USD, SBP for RUB, and crypto for USDT. The API takes a concrete methods array rather than the string any. Each method has its own quote.",
            "For a new invoice in the interface, USD offers cards and Alipay; RUB offers SBP; USDT offers crypto. The API can also save USD + crypto for compatibility, but its live crypto payment is blocked with crypto_requires_usdt. USD and USDT are distinct, with no automatic conversion or assumed 1:1 rate. A crypto payment requires a separate USDT invoice.",
            "For a new live card or Alipay payment, the current gateway supports only feeCustomerPercent=0 and vatCustomerPercent=100: the merchant covers the entire processing fee and VAT is added in full for the customer. Other shares can be saved and calculated on an invoice, but execution is blocked with unsupported_allocation. The server never silently changes saved terms. SBP and USDT crypto payments support every processing-fee share and have no VAT."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Send methods through the API",
              "href": "/docs/payment-links-api#methods"
            }
          ]
        },
        {
          "id": "create",
          "title": "Creating a link",
          "paragraphs": [],
          "bullets": [],
          "steps": [
            "Open Payment links in your account.",
            "Enter a title, amount, currency and description. Set fee and VAT shares with the two controls.",
            "Keep Any to let the customer choose, or select specific methods. Set the expiration.",
            "Compare the total for each method and preview checkout.",
            "Receive the ready checkout link immediately after creation, then copy it for your customer or widget."
          ],
          "table": null,
          "code": null,
          "note": "If payment acceptance is unavailable, checkout reports this before confirmation. Creating an invoice does not charge money.",
          "links": []
        },
        {
          "id": "fixed",
          "title": "Terms stay with the invoice",
          "paragraphs": [
            "A saved invoice does not change when store settings change. Its price, currency, fee and VAT shares, order reference and metadata belong to that order. This keeps the total consistent for a customer who has already opened the link.",
            "Create a new link and pause the old one when the price, description or cost allocation changes. Editing a URL amount cannot change the server calculation."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "public",
          "title": "A dedicated checkout page",
          "paragraphs": [
            "Server links are saved in the database and open across devices at /pay/… without merchant account access. A customer does not need to register to view an invoice. Store balances, settings and other customer records remain private.",
            "The /pay/demo example previews the experience without charging money. Browser demo links are test data and must not be presented as real invoices."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Preview checkout",
              "href": "/pay/demo"
            },
            {
              "label": "Checkout states",
              "href": "/docs/checkout"
            }
          ]
        },
        {
          "id": "control",
          "title": "Managing availability",
          "paragraphs": [
            "Pausing, cancelling or expiring a link blocks a new operation. It does not hide a dispatched payment: status, reconciliation and a requested bank code remain available. Link availability and financial state are checked separately.",
            "Resuming lifts a pause without changing terms. Cancellation is final, and an expired link cannot be extended. Create a new invoice for a new order or changed terms, not to retry a charge whose result is unknown."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        }
      ],
      "body": "A payment link opens a dedicated order page. Customers see the seller, purchase description, available methods and total due on their phone or computer.\n\nWhat an invoice includes\n\nFor a new invoice in the interface, USD offers cards and Alipay; RUB offers SBP; USDT offers crypto. The API can also save USD + crypto for compatibility, but its live crypto payment is blocked with crypto_requires_usdt. USD and USDT are distinct, with no automatic conversion or assumed 1:1 rate. A crypto payment requires a separate USDT invoice.\n\nNever include passwords, API keys, card details or bank codes in public descriptions. Use an order title and reference the customer recognizes.\n\nStore name, an order title of up to 120 characters and a description of up to 500 characters.\n\nBase amount and an explicit USD, RUB or USDT currency.\n\nCompatible methods, separate fee and VAT shares, an order reference and link expiry.\n\nOwner responses include link.payment with the saved state of an existing operation; this is separate from the link’s availability state.\n\nAny — the customer chooses\n\nAny selects all methods compatible with the invoice currency: cards and Alipay for USD, SBP for RUB, and crypto for USDT. The API takes a concrete methods array rather than the string any. Each method has its own quote.\n\nFor a new invoice in the interface, USD offers cards and Alipay; RUB offers SBP; USDT offers crypto. The API can also save USD + crypto for compatibility, but its live crypto payment is blocked with crypto_requires_usdt. USD and USDT are distinct, with no automatic conversion or assumed 1:1 rate. A crypto payment requires a separate USDT invoice.\n\nFor a new live card or Alipay payment, the current gateway supports only feeCustomerPercent=0 and vatCustomerPercent=100: the merchant covers the entire processing fee and VAT is added in full for the customer. Other shares can be saved and calculated on an invoice, but execution is blocked with unsupported_allocation. The server never silently changes saved terms. SBP and USDT crypto payments support every processing-fee share and have no VAT.\n\nSend methods through the API: https://kevmi.one/en/docs/payment-links-api#methods\n\nCreating a link\n\n1. Open Payment links in your account.\n\n2. Enter a title, amount, currency and description. Set fee and VAT shares with the two controls.\n\n3. Keep Any to let the customer choose, or select specific methods. Set the expiration.\n\n4. Compare the total for each method and preview checkout.\n\n5. Receive the ready checkout link immediately after creation, then copy it for your customer or widget.\n\nIf payment acceptance is unavailable, checkout reports this before confirmation. Creating an invoice does not charge money.\n\nTerms stay with the invoice\n\nA saved invoice does not change when store settings change. Its price, currency, fee and VAT shares, order reference and metadata belong to that order. This keeps the total consistent for a customer who has already opened the link.\n\nCreate a new link and pause the old one when the price, description or cost allocation changes. Editing a URL amount cannot change the server calculation.\n\nA dedicated checkout page\n\nServer links are saved in the database and open across devices at /pay/… without merchant account access. A customer does not need to register to view an invoice. Store balances, settings and other customer records remain private.\n\nThe /pay/demo example previews the experience without charging money. Browser demo links are test data and must not be presented as real invoices.\n\nPreview checkout: https://kevmi.one/en/pay/demo\n\nCheckout states: https://kevmi.one/en/docs/checkout\n\nManaging availability\n\nPausing, cancelling or expiring a link blocks a new operation. It does not hide a dispatched payment: status, reconciliation and a requested bank code remain available. Link availability and financial state are checked separately.\n\nResuming lifts a pause without changing terms. Cancellation is final, and an expired link cannot be extended. Create a new invoice for a new order or changed terms, not to retry a charge whose result is unknown.",
      "readMinutes": 5
    },
    {
      "id": "checkout",
      "title": "Checkout",
      "summary": "Checkout shows the customer what they are buying, how they can pay and the amount due before confirmation. It is separate from the merchant workspace.",
      "group": "payments",
      "url": "/docs/checkout",
      "tags": [
        "checkout",
        "customer",
        "pay",
        "invoice",
        "payment error"
      ],
      "sections": [
        {
          "id": "review",
          "title": "Review the order",
          "paragraphs": [
            "Check the store name, purchase, base price and currency. If they differ from your agreement with the seller, ask for a corrected invoice before continuing.",
            "A public invoice only requires its address; access to the seller’s account is not needed. A demo page is clearly marked and does not collect card details for a real charge."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "method",
          "title": "Choose a method",
          "paragraphs": [
            "For a new invoice in the interface, USD offers cards and Alipay; RUB offers SBP; USDT offers crypto. The API can also save USD + crypto for compatibility, but its live crypto payment is blocked with crypto_requires_usdt. USD and USDT are distinct, with no automatic conversion or assumed 1:1 rate. A crypto payment requires a separate USDT invoice.",
            "Card: the browser encrypts payment details with the gateway public key. Kevmi relays the encrypted envelope; its server does not accept or store plaintext card numbers, CVV or one-time bank codes. A requested bank-code form appears only while the gateway’s challenge is valid.",
            "Alipay: the customer supplies a name and receives a QR code. SBP opens the bank payment URL; a gateway-provided QR can also be used. An expiry is shown when the gateway provides one.",
            "Crypto: choose a coin, then an available network from the current catalogue. After creating an operation, checkout displays the exact decimal amount, recipient address and two QR modes: address only, or address and amount. The wallet network must match the chosen network. A USDT invoice price does not lock another coin’s exchange rate: use the amount supplied by the gateway. Expired instructions are hidden while reconciliation continues for the same payment.",
            "For a new live card or Alipay payment, the current gateway supports only feeCustomerPercent=0 and vatCustomerPercent=100: the merchant covers the entire processing fee and VAT is added in full for the customer. Other shares can be saved and calculated on an invoice, but execution is blocked with unsupported_allocation. The server never silently changes saved terms. SBP and USDT crypto payments support every processing-fee share and have no VAT."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "states",
          "title": "Checkout states",
          "paragraphs": [],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "State",
              "Meaning",
              "Next step"
            ],
            "rows": [
              [
                "Active",
                "The invoice is available to view",
                "Check the total and the selected method’s availability"
              ],
              [
                "Paused / expired / cancelled",
                "No new payment can start through the link",
                "Contact the seller; an original operation is checked separately"
              ],
              [
                "Not found",
                "The address is invalid or unavailable",
                "Check the complete address"
              ],
              [
                "Payment unavailable",
                "A new operation is blocked by configuration, method, limit, allocation or merchant review",
                "Follow the displayed message; saved invoice terms do not change"
              ],
              [
                "Pending / action required",
                "The original operation exists or needs confirmation",
                "Complete the current step or check its status"
              ],
              [
                "Result being checked",
                "A confirmed result is not yet available",
                "Check the original operation; do not create a second charge"
              ]
            ]
          },
          "code": null,
          "note": "A network error or missing response does not prove that no charge occurred. An already dispatched operation remains readable even if the link no longer accepts new payments.",
          "links": []
        },
        {
          "id": "confirmation",
          "title": "What confirms payment",
          "paragraphs": [
            "Payment is confirmed by server reconciliation of the exact gateway operation. succeeded requires fulfillment_ready=true, verification=provider_confirmed, no dispute and an exact match between the paid amount and approved total. Crypto additionally requires confirmed settlement evidence.",
            "A redirect, widget message, accepted bank code or browser observation does not confirm money. After a timeout, read the original operation’s status; a replacement attempt is never created automatically.",
            "A new payment and card intent require the merchant’s latest website-review application to be approved. Approval alone does not connect the payment gateway. If the review changes after dispatch, the existing operation remains available for status reads, reconciliation and a requested bank code."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "help",
          "title": "Getting help",
          "paragraphs": [
            "Send the seller the invoice reference or address, the time of the attempt and the error shown. Do not send CVV, a banking password, confirmation code or seed phrase to support. The documentation assistant can explain terms but cannot independently confirm a credit."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Payment help",
              "href": "/?support=open"
            },
            {
              "label": "VAT calculation",
              "href": "/docs/vat"
            }
          ]
        }
      ],
      "body": "Checkout shows the customer what they are buying, how they can pay and the amount due before confirmation. It is separate from the merchant workspace.\n\nReview the order\n\nCheck the store name, purchase, base price and currency. If they differ from your agreement with the seller, ask for a corrected invoice before continuing.\n\nA public invoice only requires its address; access to the seller’s account is not needed. A demo page is clearly marked and does not collect card details for a real charge.\n\nChoose a method\n\nFor a new invoice in the interface, USD offers cards and Alipay; RUB offers SBP; USDT offers crypto. The API can also save USD + crypto for compatibility, but its live crypto payment is blocked with crypto_requires_usdt. USD and USDT are distinct, with no automatic conversion or assumed 1:1 rate. A crypto payment requires a separate USDT invoice.\n\nCard: the browser encrypts payment details with the gateway public key. Kevmi relays the encrypted envelope; its server does not accept or store plaintext card numbers, CVV or one-time bank codes. A requested bank-code form appears only while the gateway’s challenge is valid.\n\nAlipay: the customer supplies a name and receives a QR code. SBP opens the bank payment URL; a gateway-provided QR can also be used. An expiry is shown when the gateway provides one.\n\nCrypto: choose a coin, then an available network from the current catalogue. After creating an operation, checkout displays the exact decimal amount, recipient address and two QR modes: address only, or address and amount. The wallet network must match the chosen network. A USDT invoice price does not lock another coin’s exchange rate: use the amount supplied by the gateway. Expired instructions are hidden while reconciliation continues for the same payment.\n\nFor a new live card or Alipay payment, the current gateway supports only feeCustomerPercent=0 and vatCustomerPercent=100: the merchant covers the entire processing fee and VAT is added in full for the customer. Other shares can be saved and calculated on an invoice, but execution is blocked with unsupported_allocation. The server never silently changes saved terms. SBP and USDT crypto payments support every processing-fee share and have no VAT.\n\nCheckout states\n\nState · Meaning · Next step\nActive · The invoice is available to view · Check the total and the selected method’s availability\nPaused / expired / cancelled · No new payment can start through the link · Contact the seller; an original operation is checked separately\nNot found · The address is invalid or unavailable · Check the complete address\nPayment unavailable · A new operation is blocked by configuration, method, limit, allocation or merchant review · Follow the displayed message; saved invoice terms do not change\nPending / action required · The original operation exists or needs confirmation · Complete the current step or check its status\nResult being checked · A confirmed result is not yet available · Check the original operation; do not create a second charge\n\nA network error or missing response does not prove that no charge occurred. An already dispatched operation remains readable even if the link no longer accepts new payments.\n\nWhat confirms payment\n\nPayment is confirmed by server reconciliation of the exact gateway operation. succeeded requires fulfillment_ready=true, verification=provider_confirmed, no dispute and an exact match between the paid amount and approved total. Crypto additionally requires confirmed settlement evidence.\n\nA redirect, widget message, accepted bank code or browser observation does not confirm money. After a timeout, read the original operation’s status; a replacement attempt is never created automatically.\n\nA new payment and card intent require the merchant’s latest website-review application to be approved. Approval alone does not connect the payment gateway. If the review changes after dispatch, the existing operation remains available for status reads, reconciliation and a requested bank code.\n\nGetting help\n\nSend the seller the invoice reference or address, the time of the attempt and the error shown. Do not send CVV, a banking password, confirmation code or seed phrase to support. The documentation assistant can explain terms but cannot independently confirm a credit.\n\nPayment help: https://kevmi.one/en?support=open\n\nVAT calculation: https://kevmi.one/en/docs/vat",
      "readMinutes": 5
    },
    {
      "id": "payments",
      "title": "Payments and statuses",
      "summary": "An invoice describes an order. A payment is a specific attempt to pay it. A payment attempt and the availability of its link are separate states.",
      "group": "payments",
      "url": "/docs/payments",
      "tags": [
        "payment",
        "status",
        "pending",
        "succeeded",
        "failed"
      ],
      "sections": [
        {
          "id": "record",
          "title": "The payment record",
          "paragraphs": [
            "The invoice stores order terms; payment identifies its gateway operation. The first launch reserves one durable binding and a server Idempotency-Key. After dispatch begins, another method cannot create a second charge on the same invoice.",
            "GET /api/payment-links and GET /api/v1/payments return link.payment to the owner. The link’s active/paused/cancelled/expired status is separate from payment state. A customer can only read their operation through the random checkout token."
          ],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Data",
              "Purpose"
            ],
            "rows": [
              [
                "Identifier and order",
                "Associate the attempt with a purchase"
              ],
              [
                "Base amount and currency",
                "The calculation base"
              ],
              [
                "Payment method",
                "Applicable fee and tax"
              ],
              [
                "VAT payer",
                "Who covers the tax"
              ],
              [
                "Fee, VAT and totals",
                "Saved calculation"
              ],
              [
                "Status and time",
                "Current transaction state"
              ],
              [
                "Gateway event reference",
                "Server confirmation source"
              ]
            ]
          },
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "statuses",
          "title": "Live operation states",
          "paragraphs": [
            "The demo uses separate test records. Changing a demo state does not confirm a real payment or change financial records."
          ],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Status",
              "Meaning"
            ],
            "rows": [
              [
                "pending",
                "Operation created; awaiting action or a result"
              ],
              [
                "requires_action",
                "A bank code or customer confirmation is required"
              ],
              [
                "processing",
                "The provider is still confirming the result"
              ],
              [
                "succeeded",
                "The server verified the exact payment"
              ],
              [
                "failed",
                "Attempt ended without confirmed payment"
              ],
              [
                "expired",
                "Instructions expired; reconciliation remains available"
              ],
              [
                "review_required",
                "Additional review is needed; do not pay again"
              ],
              [
                "partially_paid",
                "Only part of the amount received; do not create another payment"
              ],
              [
                "partially_refunded",
                "Part of the payment was refunded"
              ],
              [
                "refunded",
                "Refund confirmed"
              ],
              [
                "disputed",
                "The operation is disputed"
              ]
            ]
          },
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "authority",
          "title": "The source of truth",
          "paragraphs": [
            "A signed webhook triggers an authenticated read of the exact gateway operation. IDs, order, currency, method, base and final amounts, live mode and monotonic version are validated. An incoming event name alone is not proof of money.",
            "State, receipt and the merchant event commit atomically. Older responses cannot overwrite a newer version; duplicates do not fulfil twice, and pending cannot replace a confirmed payment. These records do not automatically create a withdrawable balance or payout."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "uncertain",
          "title": "When the result is unknown",
          "paragraphs": [],
          "bullets": [],
          "steps": [
            "Keep the original invoice and operation identifier.",
            "Read GET /api/checkout/{token}/status; it does not create a charge.",
            "Use POST /api/checkout/{token}/reconcile when explicit reconciliation is needed.",
            "Do not change method, amount or idempotency key after an uncertain result."
          ],
          "table": null,
          "code": null,
          "note": "A timeout is not a decline. A lost response is recovered by the original server key; no replacement attempt is created automatically.",
          "links": []
        }
      ],
      "body": "An invoice describes an order. A payment is a specific attempt to pay it. A payment attempt and the availability of its link are separate states.\n\nThe payment record\n\nThe invoice stores order terms; payment identifies its gateway operation. The first launch reserves one durable binding and a server Idempotency-Key. After dispatch begins, another method cannot create a second charge on the same invoice.\n\nGET /api/payment-links and GET /api/v1/payments return link.payment to the owner. The link’s active/paused/cancelled/expired status is separate from payment state. A customer can only read their operation through the random checkout token.\n\nData · Purpose\nIdentifier and order · Associate the attempt with a purchase\nBase amount and currency · The calculation base\nPayment method · Applicable fee and tax\nVAT payer · Who covers the tax\nFee, VAT and totals · Saved calculation\nStatus and time · Current transaction state\nGateway event reference · Server confirmation source\n\nLive operation states\n\nThe demo uses separate test records. Changing a demo state does not confirm a real payment or change financial records.\n\nStatus · Meaning\npending · Operation created; awaiting action or a result\nrequires_action · A bank code or customer confirmation is required\nprocessing · The provider is still confirming the result\nsucceeded · The server verified the exact payment\nfailed · Attempt ended without confirmed payment\nexpired · Instructions expired; reconciliation remains available\nreview_required · Additional review is needed; do not pay again\npartially_paid · Only part of the amount received; do not create another payment\npartially_refunded · Part of the payment was refunded\nrefunded · Refund confirmed\ndisputed · The operation is disputed\n\nThe source of truth\n\nA signed webhook triggers an authenticated read of the exact gateway operation. IDs, order, currency, method, base and final amounts, live mode and monotonic version are validated. An incoming event name alone is not proof of money.\n\nState, receipt and the merchant event commit atomically. Older responses cannot overwrite a newer version; duplicates do not fulfil twice, and pending cannot replace a confirmed payment. These records do not automatically create a withdrawable balance or payout.\n\nWhen the result is unknown\n\n1. Keep the original invoice and operation identifier.\n\n2. Read GET /api/checkout/{token}/status; it does not create a charge.\n\n3. Use POST /api/checkout/{token}/reconcile when explicit reconciliation is needed.\n\n4. Do not change method, amount or idempotency key after an uncertain result.\n\nA timeout is not a decline. A lost response is recovered by the original server key; no replacement attempt is created automatically.",
      "readMinutes": 3
    },
    {
      "id": "payouts",
      "title": "USDT TRC20 payouts",
      "summary": "Payout terms specify USDT on TRC20, with fees based on the source of funds. This guide covers fees, quote requirements and restrictions: payout creation through the account and API is unavailable.",
      "group": "payments",
      "url": "/docs/payouts",
      "tags": [
        "payout",
        "withdrawal",
        "USDT",
        "TRC20",
        "wallet",
        "exchange rate"
      ],
      "sections": [
        {
          "id": "tariffs",
          "title": "Fees by source",
          "paragraphs": [
            "The acceptance fee has already been included in the merchant credit. A payout is a separate operation with its own fee. Do not apply the acceptance fee to the balance a second time."
          ],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Source",
              "Fee"
            ],
            "rows": [
              [
                "Cards and Alipay",
                "4%"
              ],
              [
                "SBP",
                "5% + RUB 400"
              ],
              [
                "Cryptocurrency",
                "0% + $3"
              ]
            ]
          },
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "quote",
          "title": "Quotes and currencies",
          "paragraphs": [
            "Amounts in USD and RUB must be accounted for separately. Do not add them without an exchange rate. USD is a fiat currency and USDT is a digital asset; an automatic 1:1 exchange rate is not assumed.",
            "A quote must state the source currency and amount, fee, USDT output and expiration. Changes to the amount or wallet require a fresh check of the terms."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "address",
          "title": "Recipient address",
          "paragraphs": [
            "Use a TRC20 address belonging to the recipient. Address format validation can catch some typos but cannot verify the owner or guarantee delivery.",
            "Check the full address and network before sending. The server must validate the amount, available balance and quote independently of the client form."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "flow",
          "title": "The payout process",
          "paragraphs": [
            "The demo uses a manually entered quote for calculation only. A test payout reserves demo funds and does not transfer assets."
          ],
          "bullets": [],
          "steps": [
            "Choose the source of funds and debit amount.",
            "Enter a TRC20 address.",
            "Get a current quote and review the fee.",
            "Confirm the exact request terms.",
            "Wait for a server-confirmed result."
          ],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "availability",
          "title": "Payout availability",
          "paragraphs": [
            "Payout creation through the account and /api/payouts is unavailable. Published fees and a fee calculation do not create a transfer request or confirm its execution.",
            "Verified payments, receipts and events are kept in the history. These records are not a withdrawable balance. Executing a payout requires a separate funds ledger, a current quote, destination validation and transfer confirmation."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Gateway integration",
              "href": "/docs/gateway"
            }
          ]
        }
      ],
      "body": "Payout terms specify USDT on TRC20, with fees based on the source of funds. This guide covers fees, quote requirements and restrictions: payout creation through the account and API is unavailable.\n\nFees by source\n\nThe acceptance fee has already been included in the merchant credit. A payout is a separate operation with its own fee. Do not apply the acceptance fee to the balance a second time.\n\nSource · Fee\nCards and Alipay · 4%\nSBP · 5% + RUB 400\nCryptocurrency · 0% + $3\n\nQuotes and currencies\n\nAmounts in USD and RUB must be accounted for separately. Do not add them without an exchange rate. USD is a fiat currency and USDT is a digital asset; an automatic 1:1 exchange rate is not assumed.\n\nA quote must state the source currency and amount, fee, USDT output and expiration. Changes to the amount or wallet require a fresh check of the terms.\n\nRecipient address\n\nUse a TRC20 address belonging to the recipient. Address format validation can catch some typos but cannot verify the owner or guarantee delivery.\n\nCheck the full address and network before sending. The server must validate the amount, available balance and quote independently of the client form.\n\nThe payout process\n\nThe demo uses a manually entered quote for calculation only. A test payout reserves demo funds and does not transfer assets.\n\n1. Choose the source of funds and debit amount.\n\n2. Enter a TRC20 address.\n\n3. Get a current quote and review the fee.\n\n4. Confirm the exact request terms.\n\n5. Wait for a server-confirmed result.\n\nPayout availability\n\nPayout creation through the account and /api/payouts is unavailable. Published fees and a fee calculation do not create a transfer request or confirm its execution.\n\nVerified payments, receipts and events are kept in the history. These records are not a withdrawable balance. Executing a payout requires a separate funds ledger, a current quote, destination validation and transfer confirmation.\n\nGateway integration: https://kevmi.one/en/docs/gateway",
      "readMinutes": 3
    },
    {
      "id": "telegram-login",
      "title": "Sign in and register with Telegram",
      "summary": "Telegram verifies your identity. Kevmi creates your account on the first sign-in and opens it on later visits. A separate Kevmi password is not required.",
      "group": "account",
      "url": "/docs/telegram-login",
      "tags": [
        "Telegram",
        "sign in",
        "login",
        "register",
        "account",
        "bot"
      ],
      "sections": [
        {
          "id": "steps",
          "title": "Signing in",
          "paragraphs": [
            "The request lasts five minutes. Start a new request if it expires. An old request cannot be reused to obtain a session."
          ],
          "bullets": [],
          "steps": [
            "Open Sign in or Create account and select Continue with Telegram.",
            "Follow the bot link created by this browser.",
            "Compare the six-digit code on the website and in the bot message.",
            "Confirm in the private chat.",
            "Return to the original browser. Your account opens after verification."
          ],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "browser",
          "title": "Why the original browser matters",
          "paragraphs": [
            "The Telegram link is bound to a protected cookie in the browser that started sign-in. A challengeId or forwarded link alone cannot create a session on another device.",
            "You can confirm in Telegram on another device, but the account opens in the browser where sign-in began. Do not confirm a request you did not start."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "session",
          "title": "Sessions and sign-out",
          "paragraphs": [
            "A session lasts up to 24 hours. Its random token is stored in a Secure HttpOnly cookie and cannot be read by JavaScript. Website sign-out ends the current session.",
            "The bot command /logout ends all account sessions and cancels unused confirmations. A new sign-in requires a new request."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "trouble",
          "title": "Troubleshooting sign-in",
          "paragraphs": [],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Situation",
              "Action"
            ],
            "rows": [
              [
                "The link expired",
                "Start a new request on the website"
              ],
              [
                "A different browser is open",
                "Return to the tab where sign-in began"
              ],
              [
                "The codes differ",
                "Do not confirm; start again"
              ],
              [
                "Sign-in unavailable",
                "Try later or contact support"
              ],
              [
                "Temporary network error",
                "Wait for the next check or retry sign-in"
              ]
            ]
          },
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "privacy",
          "title": "Information used for sign-in",
          "paragraphs": [
            "The server receives a verified Telegram ID and available profile fields to create the account. A public username alone is not proof of identity.",
            "The bot does not ask for your Telegram password, banking codes, CVV, seed phrase or private keys."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Authentication API",
              "href": "/docs/auth-api"
            },
            {
              "label": "Sign in",
              "href": "/login"
            }
          ]
        }
      ],
      "body": "Telegram verifies your identity. Kevmi creates your account on the first sign-in and opens it on later visits. A separate Kevmi password is not required.\n\nSigning in\n\nThe request lasts five minutes. Start a new request if it expires. An old request cannot be reused to obtain a session.\n\n1. Open Sign in or Create account and select Continue with Telegram.\n\n2. Follow the bot link created by this browser.\n\n3. Compare the six-digit code on the website and in the bot message.\n\n4. Confirm in the private chat.\n\n5. Return to the original browser. Your account opens after verification.\n\nWhy the original browser matters\n\nThe Telegram link is bound to a protected cookie in the browser that started sign-in. A challengeId or forwarded link alone cannot create a session on another device.\n\nYou can confirm in Telegram on another device, but the account opens in the browser where sign-in began. Do not confirm a request you did not start.\n\nSessions and sign-out\n\nA session lasts up to 24 hours. Its random token is stored in a Secure HttpOnly cookie and cannot be read by JavaScript. Website sign-out ends the current session.\n\nThe bot command /logout ends all account sessions and cancels unused confirmations. A new sign-in requires a new request.\n\nTroubleshooting sign-in\n\nSituation · Action\nThe link expired · Start a new request on the website\nA different browser is open · Return to the tab where sign-in began\nThe codes differ · Do not confirm; start again\nSign-in unavailable · Try later or contact support\nTemporary network error · Wait for the next check or retry sign-in\n\nInformation used for sign-in\n\nThe server receives a verified Telegram ID and available profile fields to create the account. A public username alone is not proof of identity.\n\nThe bot does not ask for your Telegram password, banking codes, CVV, seed phrase or private keys.\n\nAuthentication API: https://kevmi.one/en/docs/auth-api\n\nSign in: https://kevmi.one/en/login",
      "readMinutes": 3
    },
    {
      "id": "settings",
      "title": "Store settings",
      "summary": "Settings connect your store name, VAT rule and notifications to your verified account. Changes are saved on the server for the current user.",
      "group": "account",
      "url": "/docs/settings",
      "tags": [
        "settings",
        "store",
        "VAT payer",
        "theme",
        "notifications"
      ],
      "sections": [
        {
          "id": "name",
          "title": "Store name",
          "paragraphs": [
            "Choose a short, recognizable name that your customer expects to see on the order. The name must contain 1–80 characters after trimming surrounding spaces.",
            "A display name does not replace legal details or your customer agreement. Keep secrets, payment credentials and other people’s personal information out of this field."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "vat",
          "title": "VAT payer",
          "paragraphs": [
            "The default payer is the customer. VAT applies only to cards and Alipay. Switching the setting does not change SBP or cryptocurrency totals.",
            "Existing invoices keep their saved terms. When creating an invoice, independent customer VAT and fee shares from 0 to 100% can override the defaults. The store preference only supplies a default for future invoices.",
            "A saved preference does not expand gateway capabilities. The current live card and Alipay channels require 100% customer VAT and 0% customer processing fee; other saved allocations remain calculations."
          ],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Value",
              "Rule for a new invoice"
            ],
            "rows": [
              [
                "customer",
                "VAT is added to the customer base price"
              ],
              [
                "merchant",
                "The merchant covers VAT from the base price"
              ]
            ]
          },
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "notifications",
          "title": "Telegram notifications",
          "paragraphs": [
            "Select payment, payout, support and security categories. Choosing a category controls notifications; it does not activate a payment channel or generate financial events.",
            "A test message checks delivery to the linked private chat. Its status appears in the notification center and GET /api/notifications. A queued message is not yet delivered; also check Telegram."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Notification guide",
              "href": "/docs/notifications"
            }
          ]
        },
        {
          "id": "saving",
          "title": "Saving and errors",
          "paragraphs": [
            "The form confirms a completed save. If the network fails, your input remains available for a retry; pressing Save alone does not prove the change was stored.",
            "Sign in again when your session expires. The server identifies the account from the session and does not accept another store owner ID from the browser."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "local",
          "title": "Theme and demo data",
          "paragraphs": [
            "The display theme is saved locally on the device. The demo workspace uses separate browser data and does not change the server account.",
            "Resetting the demo removes only test records in that browser. A demo export is not a bank statement or proof of payment."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        }
      ],
      "body": "Settings connect your store name, VAT rule and notifications to your verified account. Changes are saved on the server for the current user.\n\nStore name\n\nChoose a short, recognizable name that your customer expects to see on the order. The name must contain 1–80 characters after trimming surrounding spaces.\n\nA display name does not replace legal details or your customer agreement. Keep secrets, payment credentials and other people’s personal information out of this field.\n\nVAT payer\n\nThe default payer is the customer. VAT applies only to cards and Alipay. Switching the setting does not change SBP or cryptocurrency totals.\n\nExisting invoices keep their saved terms. When creating an invoice, independent customer VAT and fee shares from 0 to 100% can override the defaults. The store preference only supplies a default for future invoices.\n\nA saved preference does not expand gateway capabilities. The current live card and Alipay channels require 100% customer VAT and 0% customer processing fee; other saved allocations remain calculations.\n\nValue · Rule for a new invoice\ncustomer · VAT is added to the customer base price\nmerchant · The merchant covers VAT from the base price\n\nTelegram notifications\n\nSelect payment, payout, support and security categories. Choosing a category controls notifications; it does not activate a payment channel or generate financial events.\n\nA test message checks delivery to the linked private chat. Its status appears in the notification center and GET /api/notifications. A queued message is not yet delivered; also check Telegram.\n\nNotification guide: https://kevmi.one/en/docs/notifications\n\nSaving and errors\n\nThe form confirms a completed save. If the network fails, your input remains available for a retry; pressing Save alone does not prove the change was stored.\n\nSign in again when your session expires. The server identifies the account from the session and does not accept another store owner ID from the browser.\n\nTheme and demo data\n\nThe display theme is saved locally on the device. The demo workspace uses separate browser data and does not change the server account.\n\nResetting the demo removes only test records in that browser. A demo export is not a bank statement or proof of payment.",
      "readMinutes": 3
    },
    {
      "id": "notifications",
      "title": "Website and Telegram notifications",
      "summary": "Account events appear under the bell in the top bar. Read notifications, check Telegram delivery and open the relevant part of your workspace.",
      "group": "account",
      "url": "/docs/notifications",
      "tags": [
        "notifications",
        "Telegram",
        "bell",
        "read",
        "delivery"
      ],
      "sections": [
        {
          "id": "inbox",
          "title": "Notification center",
          "paragraphs": [
            "The badge counts unread account events. Messages are grouped by date; Load more retrieves older records. Visitors are asked to sign in.",
            "Read state is stored on the server. Visible pages refresh automatically and open tabs synchronize read marks. Events newer than the last displayed message are not marked read along with older ones."
          ],
          "bullets": [],
          "steps": [
            "Select the bell in the top bar.",
            "Choose all events or unread only.",
            "Open the related page or mark a message as read.",
            "Use Mark all as read for events already loaded."
          ],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "types",
          "title": "Event categories",
          "paragraphs": [
            "Support and security are enabled for a new account; payment categories are selected by the user. The center shows saved events for enabled categories. Browser demo events are not real fund notifications."
          ],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Category",
              "Contents"
            ],
            "rows": [
              [
                "Payments",
                "Confirmed payment events"
              ],
              [
                "Payouts",
                "Confirmed payout events"
              ],
              [
                "Support",
                "Support requests and application stage updates"
              ],
              [
                "Security",
                "A new verified sign-in"
              ],
              [
                "Test",
                "Delivery check to your Telegram"
              ]
            ]
          },
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "setup",
          "title": "Configuring delivery",
          "paragraphs": [
            "Tests are limited to three per account per hour. A test does not change a balance or create a payment. Queueing a message does not prove delivery."
          ],
          "bullets": [],
          "steps": [
            "Sign in with Telegram and open Account → Notifications.",
            "Enable the desired categories and save.",
            "Select Test delivery.",
            "Check the center status and the bot’s private chat."
          ],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Notification settings",
              "href": "/account#notifications"
            }
          ]
        },
        {
          "id": "statuses",
          "title": "Delivery and read state are separate",
          "paragraphs": [
            "Delivery depends on Telegram availability and user permissions. A lost response can lead to a repeated message, but not a repeated financial operation.",
            "If delivery fails, check that the bot is reachable and not blocked. Application notification retries also run in background jobs; service interactions can trigger other queued deliveries. Check the notification center for the current status."
          ],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Status",
              "Meaning"
            ],
            "rows": [
              [
                "pending",
                "Queued for processing"
              ],
              [
                "sending",
                "The server is attempting delivery"
              ],
              [
                "sent",
                "Telegram confirmed the send"
              ],
              [
                "failed",
                "Delivery failed"
              ]
            ]
          },
          "code": null,
          "note": "The message delivery status refers to Telegram. Marking a notification read on the website does not mean it was read in Telegram and does not change delivery.",
          "links": []
        },
        {
          "id": "feedback",
          "title": "Action confirmations",
          "paragraphs": [
            "The website shows a short notification after a completed save, new link or similar action. It closes automatically and stays longer when hovered or focused.",
            "This confirms the interface action. It does not replace a confirmed financial status or create a payment record. Field errors stay beside the form."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "api",
          "title": "Reading and marking through the API",
          "paragraphs": [
            "GET /api/notifications returns up to 30 account events, unreadCount and nextCursor. Pass nextCursor unchanged as cursor to load another page. unread=1 selects unread entries. Sort order is createdAt descending, then id descending.",
            "PATCH /api/notifications/read accepts either 1–100 ids, or all:true with before set to the timestamp in milliseconds of the last displayed event. A session, Origin and X-CSRF-Token are required. The client cannot set the record owner.",
            "The response contains updated, readAt and unreadCount. Reading an already-read event keeps its original readAt. Listing events does not mark them read; Telegram status and sentAt remain unchanged."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": {
            "language": "JSON · mark selected",
            "code": "{\n  \"ids\": [\"ntf_46d94180-492e-4c28-b15f-a70049161a63\"]\n}"
          },
          "note": "",
          "links": [
            {
              "label": "API reference",
              "href": "/docs/api-reference"
            }
          ]
        },
        {
          "id": "commands",
          "title": "Bot commands",
          "paragraphs": [],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Command",
              "Action"
            ],
            "rows": [
              [
                "/notifications",
                "Manage categories"
              ],
              [
                "/stop",
                "Disable notifications"
              ],
              [
                "/help",
                "List available commands"
              ],
              [
                "/logout",
                "End all account sessions"
              ]
            ]
          },
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "availability",
          "title": "Feature availability",
          "paragraphs": [
            "The notification center requires sign-in. Telegram messages are sent to the verified private bot chat. If delivery is unavailable, check bot permissions and the message status.",
            "A payment or payout notification is based on a confirmed server event. Selecting a category changes delivery preferences, not transaction availability."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        }
      ],
      "body": "Account events appear under the bell in the top bar. Read notifications, check Telegram delivery and open the relevant part of your workspace.\n\nNotification center\n\nThe badge counts unread account events. Messages are grouped by date; Load more retrieves older records. Visitors are asked to sign in.\n\nRead state is stored on the server. Visible pages refresh automatically and open tabs synchronize read marks. Events newer than the last displayed message are not marked read along with older ones.\n\n1. Select the bell in the top bar.\n\n2. Choose all events or unread only.\n\n3. Open the related page or mark a message as read.\n\n4. Use Mark all as read for events already loaded.\n\nEvent categories\n\nSupport and security are enabled for a new account; payment categories are selected by the user. The center shows saved events for enabled categories. Browser demo events are not real fund notifications.\n\nCategory · Contents\nPayments · Confirmed payment events\nPayouts · Confirmed payout events\nSupport · Support requests and application stage updates\nSecurity · A new verified sign-in\nTest · Delivery check to your Telegram\n\nConfiguring delivery\n\nTests are limited to three per account per hour. A test does not change a balance or create a payment. Queueing a message does not prove delivery.\n\n1. Sign in with Telegram and open Account → Notifications.\n\n2. Enable the desired categories and save.\n\n3. Select Test delivery.\n\n4. Check the center status and the bot’s private chat.\n\nNotification settings: https://kevmi.one/en/account#notifications\n\nDelivery and read state are separate\n\nDelivery depends on Telegram availability and user permissions. A lost response can lead to a repeated message, but not a repeated financial operation.\n\nIf delivery fails, check that the bot is reachable and not blocked. Application notification retries also run in background jobs; service interactions can trigger other queued deliveries. Check the notification center for the current status.\n\nStatus · Meaning\npending · Queued for processing\nsending · The server is attempting delivery\nsent · Telegram confirmed the send\nfailed · Delivery failed\n\nThe message delivery status refers to Telegram. Marking a notification read on the website does not mean it was read in Telegram and does not change delivery.\n\nAction confirmations\n\nThe website shows a short notification after a completed save, new link or similar action. It closes automatically and stays longer when hovered or focused.\n\nThis confirms the interface action. It does not replace a confirmed financial status or create a payment record. Field errors stay beside the form.\n\nReading and marking through the API\n\nGET /api/notifications returns up to 30 account events, unreadCount and nextCursor. Pass nextCursor unchanged as cursor to load another page. unread=1 selects unread entries. Sort order is createdAt descending, then id descending.\n\nPATCH /api/notifications/read accepts either 1–100 ids, or all:true with before set to the timestamp in milliseconds of the last displayed event. A session, Origin and X-CSRF-Token are required. The client cannot set the record owner.\n\nThe response contains updated, readAt and unreadCount. Reading an already-read event keeps its original readAt. Listing events does not mark them read; Telegram status and sentAt remain unchanged.\n\n{\n  \"ids\": [\"ntf_46d94180-492e-4c28-b15f-a70049161a63\"]\n}\n\nAPI reference: https://kevmi.one/en/docs/api-reference\n\nBot commands\n\nCommand · Action\n/notifications · Manage categories\n/stop · Disable notifications\n/help · List available commands\n/logout · End all account sessions\n\nFeature availability\n\nThe notification center requires sign-in. Telegram messages are sent to the verified private bot chat. If delivery is unavailable, check bot permissions and the message status.\n\nA payment or payout notification is based on a confirmed server event. Selecting a category changes delivery preferences, not transaction availability.",
      "readMinutes": 4
    },
    {
      "id": "support",
      "title": "Support chat and requests",
      "summary": "The assistant explains Kevmi’s terms, finds the right page and helps with settings. Open chat using the round button at the bottom right. Use a private request for an account-specific question.",
      "group": "account",
      "url": "/docs/support",
      "tags": [
        "support",
        "help",
        "AI",
        "assistant",
        "documentation",
        "request",
        "chat"
      ],
      "sections": [
        {
          "id": "chat",
          "title": "Help on the current page",
          "paragraphs": [
            "On phones, chat opens in a compact panel. You can minimize and reopen it; a badge appears if an answer arrives while it is closed.",
            "Support opens on the current page. The former /help address redirects to the homepage with chat open."
          ],
          "bullets": [],
          "steps": [
            "Select the round support button at the bottom right or Ask your question.",
            "Open an existing conversation or start a new one. Choose a suggestion or type a question: Enter sends; Shift + Enter adds a line.",
            "Read the answer and follow its documentation sources.",
            "Minimize chat to continue working. Messages and the draft stay in this browser."
          ],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Open support chat",
              "href": "/?support=open"
            }
          ]
        },
        {
          "id": "history",
          "title": "Conversations, drafts and history",
          "paragraphs": [
            "Keep each topic in a separate conversation. Search history by title or text, rename a conversation and pin important ones. A new conversation preserves earlier chats, and each keeps its own draft.",
            "Restore a conversation from Deleted, or permanently delete it after confirmation. History is stored in this device’s browser, survives page reloads and does not sync between devices, your account or Telegram. Clearing site data in the browser removes local history.",
            "If browser storage is unavailable, chat continues in the open page’s memory. Local conversations are separate from private support requests, which are stored on the server after sign-in."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "knowledge",
          "title": "What answers are based on",
          "paragraphs": [
            "The website and bot use one versioned knowledge base. The server provides published guides, structured pricing, allocation and country facts, the page catalog and actual feature readiness to the generative assistant. The base includes applications, API keys, widgets and webhooks.",
            "Answer sources only refer to articles in that base. When confirmed information is insufficient, the assistant says so and suggests a more specific question or support request. It does not invent countries, payout times, limits or tax obligations."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "context",
          "title": "Follow-up questions and context",
          "paragraphs": [
            "The next question includes the selected conversation’s last three question-and-answer pairs, helping with follow-ups such as “What if the merchant pays VAT?”. Other local history is not automatically attached to the request.",
            "A short section label, such as Pricing or Checkout, is also sent. The URL, query parameters and invoice token are excluded. Prior messages are untrusted context and are checked against the knowledge base."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "modes",
          "title": "AI and documentation search",
          "paragraphs": [
            "AI mode uses a configured provider, server storage and an available quota. /api/config reports configuration readiness; model connectivity is checked on a request. Unavailable generation, exhausted quota or an invalid answer falls back to labeled documentation search.",
            "Search also works without an external model. The assistant cannot read private accounts, balances, requests or payment data. It cannot charge funds, create payouts or change settings."
          ],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Mode",
              "Behavior"
            ],
            "rows": [
              [
                "ai",
                "Writes an answer from the complete published knowledge and links relevant guides"
              ],
              [
                "search",
                "Returns matching published documentation"
              ]
            ]
          },
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "question",
          "title": "Asking a useful question",
          "paragraphs": [
            "For example: “A $5 card order, with VAT paid by the merchant. What does the merchant receive?” Check exact figures in the published calculator.",
            "The chat field accepts up to 1,800 characters. If the connection fails, the question remains in the field for another attempt."
          ],
          "bullets": [
            "Name the method: card, SBP, Alipay or cryptocurrency.",
            "For a calculation, give the base amount and both customer cost shares: fee and VAT.",
            "For an error, name the page, action and message shown.",
            "Do not send passwords, sign-in codes, tokens, CVV or seed phrases."
          ],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "request",
          "title": "Asking through the API",
          "paragraphs": [
            "POST /api/support/ask accepts question with 2–2,000 characters after trim. Optional history contains up to six messages with role=user or role=assistant. User messages accept 1–1,800 characters and assistant messages 1–3,000.",
            "Optional pageContext is a section label of 1–80 characters, without URLs, tokens, query parameters or line breaks. Optional locale is ru, en, es, de or fr and selects the response language. English is the default; complete technical sources are available in Russian and English. The API does not accept system messages, tools or arbitrary provider instructions.",
            "The JSON body limit is 65,536 bytes. The response contains mode, answer, sources, knowledgeVersion and needsHuman, with aiUnavailable:true when generation is unavailable. No user session is needed; a supplied Origin must match the application."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "API contract",
              "href": "/docs/api-reference"
            }
          ]
        },
        {
          "id": "ticket",
          "title": "Private support requests",
          "paragraphs": [
            "After sign-in, create a request with a subject of 1–120 characters and a message of 5–4,000 characters. It is stored in your account and is not visible to another user.",
            "The list shows the latest 30 requests. You can close your own request. Keep its reference when asking about status; resolution time depends on the issue."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "My support requests",
              "href": "/account#support"
            }
          ]
        }
      ],
      "body": "The assistant explains Kevmi’s terms, finds the right page and helps with settings. Open chat using the round button at the bottom right. Use a private request for an account-specific question.\n\nHelp on the current page\n\nOn phones, chat opens in a compact panel. You can minimize and reopen it; a badge appears if an answer arrives while it is closed.\n\nSupport opens on the current page. The former /help address redirects to the homepage with chat open.\n\n1. Select the round support button at the bottom right or Ask your question.\n\n2. Open an existing conversation or start a new one. Choose a suggestion or type a question: Enter sends; Shift + Enter adds a line.\n\n3. Read the answer and follow its documentation sources.\n\n4. Minimize chat to continue working. Messages and the draft stay in this browser.\n\nOpen support chat: https://kevmi.one/en?support=open\n\nConversations, drafts and history\n\nKeep each topic in a separate conversation. Search history by title or text, rename a conversation and pin important ones. A new conversation preserves earlier chats, and each keeps its own draft.\n\nRestore a conversation from Deleted, or permanently delete it after confirmation. History is stored in this device’s browser, survives page reloads and does not sync between devices, your account or Telegram. Clearing site data in the browser removes local history.\n\nIf browser storage is unavailable, chat continues in the open page’s memory. Local conversations are separate from private support requests, which are stored on the server after sign-in.\n\nWhat answers are based on\n\nThe website and bot use one versioned knowledge base. The server provides published guides, structured pricing, allocation and country facts, the page catalog and actual feature readiness to the generative assistant. The base includes applications, API keys, widgets and webhooks.\n\nAnswer sources only refer to articles in that base. When confirmed information is insufficient, the assistant says so and suggests a more specific question or support request. It does not invent countries, payout times, limits or tax obligations.\n\nFollow-up questions and context\n\nThe next question includes the selected conversation’s last three question-and-answer pairs, helping with follow-ups such as “What if the merchant pays VAT?”. Other local history is not automatically attached to the request.\n\nA short section label, such as Pricing or Checkout, is also sent. The URL, query parameters and invoice token are excluded. Prior messages are untrusted context and are checked against the knowledge base.\n\nAI and documentation search\n\nAI mode uses a configured provider, server storage and an available quota. /api/config reports configuration readiness; model connectivity is checked on a request. Unavailable generation, exhausted quota or an invalid answer falls back to labeled documentation search.\n\nSearch also works without an external model. The assistant cannot read private accounts, balances, requests or payment data. It cannot charge funds, create payouts or change settings.\n\nMode · Behavior\nai · Writes an answer from the complete published knowledge and links relevant guides\nsearch · Returns matching published documentation\n\nAsking a useful question\n\nFor example: “A $5 card order, with VAT paid by the merchant. What does the merchant receive?” Check exact figures in the published calculator.\n\nThe chat field accepts up to 1,800 characters. If the connection fails, the question remains in the field for another attempt.\n\nName the method: card, SBP, Alipay or cryptocurrency.\n\nFor a calculation, give the base amount and both customer cost shares: fee and VAT.\n\nFor an error, name the page, action and message shown.\n\nDo not send passwords, sign-in codes, tokens, CVV or seed phrases.\n\nAsking through the API\n\nPOST /api/support/ask accepts question with 2–2,000 characters after trim. Optional history contains up to six messages with role=user or role=assistant. User messages accept 1–1,800 characters and assistant messages 1–3,000.\n\nOptional pageContext is a section label of 1–80 characters, without URLs, tokens, query parameters or line breaks. Optional locale is ru, en, es, de or fr and selects the response language. English is the default; complete technical sources are available in Russian and English. The API does not accept system messages, tools or arbitrary provider instructions.\n\nThe JSON body limit is 65,536 bytes. The response contains mode, answer, sources, knowledgeVersion and needsHuman, with aiUnavailable:true when generation is unavailable. No user session is needed; a supplied Origin must match the application.\n\nAPI contract: https://kevmi.one/en/docs/api-reference\n\nPrivate support requests\n\nAfter sign-in, create a request with a subject of 1–120 characters and a message of 5–4,000 characters. It is stored in your account and is not visible to another user.\n\nThe list shows the latest 30 requests. You can close your own request. Keep its reference when asking about status; resolution time depends on the issue.\n\nMy support requests: https://kevmi.one/en/account#support",
      "readMinutes": 6
    },
    {
      "id": "api-reference",
      "title": "API reference",
      "summary": "The server API supports accounts, invoices, secure checkout, statuses and webhooks. OpenAPI describes routes, fields and errors. Starting a payment requires a configured gateway, an approved merchant and supported invoice terms.",
      "group": "developers",
      "url": "/docs/api-reference",
      "tags": [
        "API",
        "OpenAPI",
        "endpoint",
        "reference",
        "JSON"
      ],
      "sections": [
        {
          "id": "base",
          "title": "Base URL and format",
          "paragraphs": [
            "The base URL is https://kevmi.one. Request and response bodies use JSON. Money values are integer minor units. Account and support dates are Unix timestamps in milliseconds.",
            "API responses use Cache-Control: no-store. The public /openapi.json can be cached for five minutes. Do not place cookies or secrets in a URL."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": {
            "language": "cURL",
            "code": "curl 'https://kevmi.one/api/config'\n\ncurl 'https://kevmi.one/openapi.json'"
          },
          "note": "",
          "links": []
        },
        {
          "id": "session",
          "title": "Request authorization",
          "paragraphs": [
            "The web account uses an HttpOnly session cookie. GET /api/auth/me returns the current user and csrfToken. Mutations require X-CSRF-Token and a same-origin request.",
            "Scoped Kevmi merchant keys authorize /api/v1/payments, /api/v1/payment-links and /api/v1/events. They do not replace the session cookie for account settings or administrative routes."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": {
            "language": "JavaScript · website browser",
            "code": "const me = await fetch('/api/auth/me').then(r => r.json());\nif (!me.authenticated) throw new Error('Sign in required');\nconst response = await fetch('/api/account/settings', {\n  method: 'PATCH',\n  headers: { 'Content-Type': 'application/json', 'X-CSRF-Token': me.csrfToken },\n  body: JSON.stringify({ vatPayer: 'merchant' })\n});\nif (!response.ok) throw new Error('Settings were not saved');\nconst updated = await response.json();"
          },
          "note": "",
          "links": []
        },
        {
          "id": "groups",
          "title": "Endpoint groups",
          "paragraphs": [
            "GET /api/config reports the presence of server configuration. GET /api/checkout/{token} returns invoice.availability for the selected method, including merchant approval and saved terms. These checks do not establish provider connectivity or payment success: the result comes from the verified gateway operation."
          ],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Group",
              "Purpose"
            ],
            "rows": [
              [
                "Config and health",
                "Public service and storage readiness"
              ],
              [
                "Authentication",
                "Telegram challenges and sessions"
              ],
              [
                "Account",
                "Settings and the private merchant app"
              ],
              [
                "/api/v1/payments",
                "Scoped server invoice creation and reads; does not initiate a charge"
              ],
              [
                "/api/v1/events",
                "Server event log with events:read"
              ],
              [
                "Integrations",
                "Session-authenticated key and webhook endpoint administration"
              ],
              [
                "Applications and moderation",
                "Owned submissions, status tracking and separate moderator permissions"
              ],
              [
                "Checkout",
                "Public invoice, encrypted card request, concrete operation, bank code, status and reconciliation"
              ],
              [
                "Gateway ingress",
                "Signed v3 notifications and authenticated operation verification"
              ],
              [
                "Support and notifications",
                "Questions, private requests, events and read state"
              ],
              [
                "Telegram",
                "Verified bot webhook"
              ],
              [
                "Unsupported money routes",
                "Legacy direct /api/payments and /api/payouts do not create a charge or payout"
              ]
            ]
          },
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "support-example",
          "title": "A public knowledge request",
          "paragraphs": [
            "The answer includes mode, answer, sources, knowledgeVersion and needsHuman. A supplied Origin must match the application origin. A server-side documentation agent can omit Origin."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": {
            "language": "cURL",
            "code": "curl 'https://kevmi.one/api/support/ask' \\\n  -H 'Content-Type: application/json' \\\n  --data '{\"question\":\"Who pays VAT?\",\"locale\":\"en\"}'"
          },
          "note": "",
          "links": []
        },
        {
          "id": "errors",
          "title": "Errors and limits",
          "paragraphs": [
            "An error includes a machine-readable code and a message. Unknown request fields are rejected. Standard JSON bodies allow 16,384 bytes; /api/support/ask and the Telegram webhook allow 65,536.",
            "429 indicates a rate limit. 503 can indicate an unavailable integration, not a declined payment. Read error.code and do not change a financial status from an HTTP status alone."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Error codes",
              "href": "/docs/errors"
            },
            {
              "label": "Complete OpenAPI specification",
              "href": "/openapi.json"
            }
          ]
        }
      ],
      "body": "The server API supports accounts, invoices, secure checkout, statuses and webhooks. OpenAPI describes routes, fields and errors. Starting a payment requires a configured gateway, an approved merchant and supported invoice terms.\n\nBase URL and format\n\nThe base URL is https://kevmi.one. Request and response bodies use JSON. Money values are integer minor units. Account and support dates are Unix timestamps in milliseconds.\n\nAPI responses use Cache-Control: no-store. The public /openapi.json can be cached for five minutes. Do not place cookies or secrets in a URL.\n\ncurl 'https://kevmi.one/api/config'\n\ncurl 'https://kevmi.one/openapi.json'\n\nRequest authorization\n\nThe web account uses an HttpOnly session cookie. GET /api/auth/me returns the current user and csrfToken. Mutations require X-CSRF-Token and a same-origin request.\n\nScoped Kevmi merchant keys authorize /api/v1/payments, /api/v1/payment-links and /api/v1/events. They do not replace the session cookie for account settings or administrative routes.\n\nconst me = await fetch('/api/auth/me').then(r => r.json());\nif (!me.authenticated) throw new Error('Sign in required');\nconst response = await fetch('/api/account/settings', {\n  method: 'PATCH',\n  headers: { 'Content-Type': 'application/json', 'X-CSRF-Token': me.csrfToken },\n  body: JSON.stringify({ vatPayer: 'merchant' })\n});\nif (!response.ok) throw new Error('Settings were not saved');\nconst updated = await response.json();\n\nEndpoint groups\n\nGET /api/config reports the presence of server configuration. GET /api/checkout/{token} returns invoice.availability for the selected method, including merchant approval and saved terms. These checks do not establish provider connectivity or payment success: the result comes from the verified gateway operation.\n\nGroup · Purpose\nConfig and health · Public service and storage readiness\nAuthentication · Telegram challenges and sessions\nAccount · Settings and the private merchant app\n/api/v1/payments · Scoped server invoice creation and reads; does not initiate a charge\n/api/v1/events · Server event log with events:read\nIntegrations · Session-authenticated key and webhook endpoint administration\nApplications and moderation · Owned submissions, status tracking and separate moderator permissions\nCheckout · Public invoice, encrypted card request, concrete operation, bank code, status and reconciliation\nGateway ingress · Signed v3 notifications and authenticated operation verification\nSupport and notifications · Questions, private requests, events and read state\nTelegram · Verified bot webhook\nUnsupported money routes · Legacy direct /api/payments and /api/payouts do not create a charge or payout\n\nA public knowledge request\n\nThe answer includes mode, answer, sources, knowledgeVersion and needsHuman. A supplied Origin must match the application origin. A server-side documentation agent can omit Origin.\n\ncurl 'https://kevmi.one/api/support/ask' \\\n  -H 'Content-Type: application/json' \\\n  --data '{\"question\":\"Who pays VAT?\",\"locale\":\"en\"}'\n\nErrors and limits\n\nAn error includes a machine-readable code and a message. Unknown request fields are rejected. Standard JSON bodies allow 16,384 bytes; /api/support/ask and the Telegram webhook allow 65,536.\n\n429 indicates a rate limit. 503 can indicate an unavailable integration, not a declined payment. Read error.code and do not change a financial status from an HTTP status alone.\n\nError codes: https://kevmi.one/en/docs/errors\n\nComplete OpenAPI specification: https://kevmi.one/openapi.json",
      "readMinutes": 4
    },
    {
      "id": "payment-links-api",
      "title": "Payment links API and API keys",
      "summary": "Create an invoice from your backend and receive checkoutUrl immediately. The API supports scoped keys, idempotent retries, independent fee and VAT shares, an order reference and private metadata.",
      "tags": [
        "API",
        "payment link",
        "idempotency",
        "checkout",
        "pagination",
        "API key",
        "scope",
        "metadata"
      ],
      "sections": [
        {
          "id": "create",
          "title": "A server request returns a ready link",
          "paragraphs": [
            "POST /api/v1/payments and /api/v1/payment-links create the same invoice type. The payments route name does not imply a charge: the result is persisted invoice terms and a checkoutUrl for the customer.",
            "Send Authorization: Bearer <key>, Content-Type: application/json and Idempotency-Key. Idempotency keys contain 16–100 letters, digits, hyphens or underscores. Persist one key for each logical order creation."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": {
            "language": "cURL · server only",
            "code": "curl 'https://kevmi.maxeevmax1.chatgpt.site/api/v1/payments' \\\n  -H \"Authorization: Bearer $KEVMI_API_KEY\" \\\n  -H 'Content-Type: application/json' \\\n  -H 'Idempotency-Key: order-1042-create-v1' \\\n  --data '{\"title\":\"Design project · order 1042\",\"description\":\"One-time payment for the agreed design work\",\"amountMinor\":500,\"currency\":\"USD\",\"methods\":[\"card\",\"alipay\"],\"vatCustomerPercent\":100,\"feeCustomerPercent\":0,\"orderId\":\"order-1042\",\"metadata\":{\"campaign\":\"autumn\"}}'"
          },
          "note": "The response contains link, checkoutUrl and replayed. Pass checkoutUrl to the customer or widget; keep the API key on your server.",
          "links": []
        },
        {
          "id": "keys",
          "title": "API key scopes and expiry",
          "paragraphs": [
            "Create a key at /account#keys in your verified merchant account. Its full value appears once; only a hash is stored. Keys last 90 days by default, with a permitted lifetime of 1–365 days and up to ten active keys per account.",
            "Grant only the required scopes. Revocation or expiry stops access. A key does not replace the browser session for account settings, endpoint administration, applications or moderation. Keep it out of widgets, URLs, public repositories and support messages.",
            "The website uses /api/payment-links with its session cookie, exact Origin and X-CSRF-Token. Those routes operate on the same owned invoices."
          ],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Scope",
              "Purpose"
            ],
            "rows": [
              [
                "invoices:read",
                "Read owned invoices and their list"
              ],
              [
                "invoices:write",
                "Create invoices and change link availability"
              ],
              [
                "events:read",
                "Read the server event log"
              ]
            ]
          },
          "code": null,
          "note": "",
          "links": [
            {
              "label": "API keys in your account",
              "href": "/account#keys"
            }
          ]
        },
        {
          "id": "methods",
          "title": "Any and concrete API methods",
          "paragraphs": [
            "Any is an interface selection mode. New invoices accept methods: [\"card\", \"alipay\"] or a nonempty subset for USD; [\"sbp\"] for RUB; [\"crypto\"] for USDT. The value any is not an API payment method.",
            "For a new invoice in the interface, USD offers cards and Alipay; RUB offers SBP; USDT offers crypto. The API can also save USD + crypto for compatibility, but its live crypto payment is blocked with crypto_requires_usdt. USD and USDT are distinct, with no automatic conversion or assumed 1:1 rate. A crypto payment requires a separate USDT invoice.",
            "For a new live card or Alipay payment, the current gateway supports only feeCustomerPercent=0 and vatCustomerPercent=100: the merchant covers the entire processing fee and VAT is added in full for the customer. Other shares can be saved and calculated on an invoice, but execution is blocked with unsupported_allocation. The server never silently changes saved terms. SBP and USDT crypto payments support every processing-fee share and have no VAT."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Any in the account interface",
              "href": "/docs/payment-links#any"
            },
            {
              "label": "Checkout",
              "href": "/docs/checkout"
            }
          ]
        },
        {
          "id": "snapshot",
          "title": "Fields and persisted terms",
          "paragraphs": [
            "The invoice saves the merchant name, price, currency, methods, both cost shares and calculated quotes. Metadata is returned to the owner and in server events, but not through public checkout. Do not store payment secrets in it.",
            "If shares are omitted, the merchant covers the fee; VAT inherits vatPayer or the account setting. A partial allocation can return vatPayer=shared. The title, orderId and description are public."
          ],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Field",
              "Rule"
            ],
            "rows": [
              [
                "title / description",
                "1–120 / 0–500 characters"
              ],
              [
                "amountMinor",
                "Integer 1–10,000,000,000; 500 means $5.00 in USD"
              ],
              [
                "currency / methods",
                "USD: card, alipay; RUB: sbp; USDT: crypto. Nonempty unique list."
              ],
              [
                "vatCustomerPercent / feeCustomerPercent",
                "Independent integer customer shares from 0 to 100"
              ],
              [
                "vatPayer",
                "Legacy customer or merchant; cannot conflict with the VAT share"
              ],
              [
                "orderId",
                "Optional, up to 100 characters; visible to the customer"
              ],
              [
                "metadata",
                "Up to ten string entries; key 1–40 letters/digits/_/-; value up to 500 characters; total up to 3000 UTF-8 bytes"
              ],
              [
                "expiresAt",
                "Future Unix ms within 90 days; seven days by default"
              ]
            ]
          },
          "code": null,
          "note": "For compatibility, the API also saves USD + crypto, but live crypto execution is blocked with crypto_requires_usdt. Use USDT for new crypto invoices; no automatic conversion is performed.",
          "links": [
            {
              "label": "Cost allocation formulas",
              "href": "/docs/cost-sharing"
            }
          ]
        },
        {
          "id": "idempotency",
          "title": "Retry after a network error",
          "paragraphs": [
            "Initial creation returns 201 with replayed=false. The same key and canonical body return 200, the original checkoutUrl and replayed=true. A different request under that key returns 409 IDEMPOTENCY_CONFLICT.",
            "Do not generate another key after a timeout. Repeat the original request with identical fields. Omitted values do not inherit changed settings again. orderId helps correlate an order but does not replace Idempotency-Key and is not required to be unique in storage."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "read",
          "title": "Reading and pagination",
          "paragraphs": [
            "GET /api/v1/payments returns links and nextCursor; GET /api/v1/payments/{id} returns one owned link. invoices:read is required. The default page size is 30; limit accepts 1–100.",
            "GET list and detail responses include link.payment: a summary of the related operation, or null when no operation exists. POST/PATCH responses may omit it; read the invoice again when you need the summary. Link status separately describes whether a new payment may start. Card fields and private keys are never included.",
            "Pass nextCursor unchanged through URLSearchParams. null marks the end; unknown and other merchants’ IDs both return 404."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": {
            "language": "HTTP",
            "code": "GET /api/v1/payments?limit=30\nAuthorization: Bearer <server-side key>"
          },
          "note": "",
          "links": []
        },
        {
          "id": "status",
          "title": "Pause, resume and cancel",
          "paragraphs": [
            "PATCH /api/v1/payments/{id} with invoices:write accepts only {\"status\":\"active\"}, {\"status\":\"paused\"} or {\"status\":\"cancelled\"}. Cancellation is final. expired is derived from the expiry time; an expired invoice cannot be extended.",
            "Price, cost shares, description, orderId, metadata and expiry are immutable. Create another invoice for different terms. Changing availability emits invoice.updated, not a successful-payment event."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "buyer",
          "title": "The customer response",
          "paragraphs": [
            "GET /api/checkout/{token}?method=card returns the public invoice, quote, method availability and existing operation. Owner metadata, secrets and balances are not exposed.",
            "POST /api/checkout/{token}/pay requires the Site Origin and a concrete method. Card data is accepted only as sealed: {intent,jwe}, after the browser obtains /card-intent. Bank codes are encrypted and sent through /code. Crypto uses a saved USDT invoice and an available coin/network pair.",
            "A new payment and card intent require the merchant’s latest website-review application to be approved. Approval alone does not connect the payment gateway. If the review changes after dispatch, the existing operation remains available for status reads, reconciliation and a requested bank code.",
            "A missing live connection returns GATEWAY_NOT_CONNECTED; an incompatible allocation is never replaced with another calculation. Status and reconcile read the original operation without a duplicate charge."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Checkout widget",
              "href": "/docs/widgets"
            },
            {
              "label": "Confirm payment with webhooks",
              "href": "/docs/webhooks"
            }
          ]
        }
      ],
      "group": "developers",
      "url": "/docs/payment-links-api",
      "body": "Create an invoice from your backend and receive checkoutUrl immediately. The API supports scoped keys, idempotent retries, independent fee and VAT shares, an order reference and private metadata.\n\nA server request returns a ready link\n\nPOST /api/v1/payments and /api/v1/payment-links create the same invoice type. The payments route name does not imply a charge: the result is persisted invoice terms and a checkoutUrl for the customer.\n\nSend Authorization: Bearer <key>, Content-Type: application/json and Idempotency-Key. Idempotency keys contain 16–100 letters, digits, hyphens or underscores. Persist one key for each logical order creation.\n\ncurl 'https://kevmi.maxeevmax1.chatgpt.site/api/v1/payments' \\\n  -H \"Authorization: Bearer $KEVMI_API_KEY\" \\\n  -H 'Content-Type: application/json' \\\n  -H 'Idempotency-Key: order-1042-create-v1' \\\n  --data '{\"title\":\"Design project · order 1042\",\"description\":\"One-time payment for the agreed design work\",\"amountMinor\":500,\"currency\":\"USD\",\"methods\":[\"card\",\"alipay\"],\"vatCustomerPercent\":100,\"feeCustomerPercent\":0,\"orderId\":\"order-1042\",\"metadata\":{\"campaign\":\"autumn\"}}'\n\nThe response contains link, checkoutUrl and replayed. Pass checkoutUrl to the customer or widget; keep the API key on your server.\n\nAPI key scopes and expiry\n\nCreate a key at /account#keys in your verified merchant account. Its full value appears once; only a hash is stored. Keys last 90 days by default, with a permitted lifetime of 1–365 days and up to ten active keys per account.\n\nGrant only the required scopes. Revocation or expiry stops access. A key does not replace the browser session for account settings, endpoint administration, applications or moderation. Keep it out of widgets, URLs, public repositories and support messages.\n\nThe website uses /api/payment-links with its session cookie, exact Origin and X-CSRF-Token. Those routes operate on the same owned invoices.\n\nScope · Purpose\ninvoices:read · Read owned invoices and their list\ninvoices:write · Create invoices and change link availability\nevents:read · Read the server event log\n\nAPI keys in your account: https://kevmi.one/en/account#keys\n\nAny and concrete API methods\n\nAny is an interface selection mode. New invoices accept methods: [\"card\", \"alipay\"] or a nonempty subset for USD; [\"sbp\"] for RUB; [\"crypto\"] for USDT. The value any is not an API payment method.\n\nFor a new invoice in the interface, USD offers cards and Alipay; RUB offers SBP; USDT offers crypto. The API can also save USD + crypto for compatibility, but its live crypto payment is blocked with crypto_requires_usdt. USD and USDT are distinct, with no automatic conversion or assumed 1:1 rate. A crypto payment requires a separate USDT invoice.\n\nFor a new live card or Alipay payment, the current gateway supports only feeCustomerPercent=0 and vatCustomerPercent=100: the merchant covers the entire processing fee and VAT is added in full for the customer. Other shares can be saved and calculated on an invoice, but execution is blocked with unsupported_allocation. The server never silently changes saved terms. SBP and USDT crypto payments support every processing-fee share and have no VAT.\n\nAny in the account interface: https://kevmi.one/en/docs/payment-links#any\n\nCheckout: https://kevmi.one/en/docs/checkout\n\nFields and persisted terms\n\nThe invoice saves the merchant name, price, currency, methods, both cost shares and calculated quotes. Metadata is returned to the owner and in server events, but not through public checkout. Do not store payment secrets in it.\n\nIf shares are omitted, the merchant covers the fee; VAT inherits vatPayer or the account setting. A partial allocation can return vatPayer=shared. The title, orderId and description are public.\n\nField · Rule\ntitle / description · 1–120 / 0–500 characters\namountMinor · Integer 1–10,000,000,000; 500 means $5.00 in USD\ncurrency / methods · USD: card, alipay; RUB: sbp; USDT: crypto. Nonempty unique list.\nvatCustomerPercent / feeCustomerPercent · Independent integer customer shares from 0 to 100\nvatPayer · Legacy customer or merchant; cannot conflict with the VAT share\norderId · Optional, up to 100 characters; visible to the customer\nmetadata · Up to ten string entries; key 1–40 letters/digits/_/-; value up to 500 characters; total up to 3000 UTF-8 bytes\nexpiresAt · Future Unix ms within 90 days; seven days by default\n\nFor compatibility, the API also saves USD + crypto, but live crypto execution is blocked with crypto_requires_usdt. Use USDT for new crypto invoices; no automatic conversion is performed.\n\nCost allocation formulas: https://kevmi.one/en/docs/cost-sharing\n\nRetry after a network error\n\nInitial creation returns 201 with replayed=false. The same key and canonical body return 200, the original checkoutUrl and replayed=true. A different request under that key returns 409 IDEMPOTENCY_CONFLICT.\n\nDo not generate another key after a timeout. Repeat the original request with identical fields. Omitted values do not inherit changed settings again. orderId helps correlate an order but does not replace Idempotency-Key and is not required to be unique in storage.\n\nReading and pagination\n\nGET /api/v1/payments returns links and nextCursor; GET /api/v1/payments/{id} returns one owned link. invoices:read is required. The default page size is 30; limit accepts 1–100.\n\nGET list and detail responses include link.payment: a summary of the related operation, or null when no operation exists. POST/PATCH responses may omit it; read the invoice again when you need the summary. Link status separately describes whether a new payment may start. Card fields and private keys are never included.\n\nPass nextCursor unchanged through URLSearchParams. null marks the end; unknown and other merchants’ IDs both return 404.\n\nGET /api/v1/payments?limit=30\nAuthorization: Bearer <server-side key>\n\nPause, resume and cancel\n\nPATCH /api/v1/payments/{id} with invoices:write accepts only {\"status\":\"active\"}, {\"status\":\"paused\"} or {\"status\":\"cancelled\"}. Cancellation is final. expired is derived from the expiry time; an expired invoice cannot be extended.\n\nPrice, cost shares, description, orderId, metadata and expiry are immutable. Create another invoice for different terms. Changing availability emits invoice.updated, not a successful-payment event.\n\nThe customer response\n\nGET /api/checkout/{token}?method=card returns the public invoice, quote, method availability and existing operation. Owner metadata, secrets and balances are not exposed.\n\nPOST /api/checkout/{token}/pay requires the Site Origin and a concrete method. Card data is accepted only as sealed: {intent,jwe}, after the browser obtains /card-intent. Bank codes are encrypted and sent through /code. Crypto uses a saved USDT invoice and an available coin/network pair.\n\nA new payment and card intent require the merchant’s latest website-review application to be approved. Approval alone does not connect the payment gateway. If the review changes after dispatch, the existing operation remains available for status reads, reconciliation and a requested bank code.\n\nA missing live connection returns GATEWAY_NOT_CONNECTED; an incompatible allocation is never replaced with another calculation. Status and reconcile read the original operation without a duplicate charge.\n\nCheckout widget: https://kevmi.one/en/docs/widgets\n\nConfirm payment with webhooks: https://kevmi.one/en/docs/webhooks",
      "readMinutes": 7
    },
    {
      "id": "auth-api",
      "title": "Authentication and session API",
      "summary": "Sign-in uses a short-lived challenge, Telegram confirmation and proof of control of the original browser. A Telegram ID supplied by the client is not proof of identity.",
      "group": "developers",
      "url": "/docs/auth-api",
      "tags": [
        "authentication",
        "session",
        "CSRF",
        "challenge",
        "API"
      ],
      "sections": [
        {
          "id": "start",
          "title": "Starting sign-in",
          "paragraphs": [
            "POST /api/auth/telegram/start accepts an empty JSON object {}. It requires the exact application Origin and an available bot. The server creates a challenge lasting 300 seconds and a protected browser-proof cookie.",
            "The 201 response contains challengeId, code, expiresAt and telegramUrl. The proof cookie is excluded from the deep link and is inaccessible to JavaScript. The limit is six starts per minute per hashed address."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": {
            "language": "JavaScript",
            "code": "const response = await fetch('/api/auth/telegram/start', {\n  method: 'POST',\n  headers: { 'Content-Type': 'application/json' },\n  body: '{}'\n});\nconst challenge = await response.json();\n// Show code and telegramUrl to the user."
          },
          "note": "",
          "links": []
        },
        {
          "id": "complete",
          "title": "Waiting for confirmation",
          "paragraphs": [
            "POST /api/auth/telegram/complete accepts {challengeId}. It requires Origin and the original browser-proof cookie. Until confirmation, the response is 202 {status: \"pending\"}.",
            "After confirmation, 200 returns status=authenticated, user, csrfToken and expiresAt. A session is issued once. Expired challenges return 410; used or cancelled challenges return 409."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": {
            "language": "JavaScript",
            "code": "const response = await fetch('/api/auth/telegram/complete', {\n  method: 'POST',\n  headers: { 'Content-Type': 'application/json' },\n  body: JSON.stringify({ challengeId: challenge.challengeId })\n});\nif (response.status === 202) {\n  // Poll again after a delay; do not create a new challenge.\n}"
          },
          "note": "",
          "links": []
        },
        {
          "id": "me",
          "title": "Reading the session",
          "paragraphs": [
            "GET /api/auth/me returns 200 {authenticated:false} when no valid session exists. A signed-in response includes the user, CSRF token and expiration.",
            "The __Host-kevmi-session cookie lasts up to 24 hours with Secure, HttpOnly, SameSite=Lax and Path=/. The database stores a SHA-256 hash of its token. A profile form cannot read or replace the cookie."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "write",
          "title": "Account changes",
          "paragraphs": [
            "Mutations require the session, exact Origin and current X-CSRF-Token. Sec-Fetch-Site: cross-site is rejected. The server does not offer arbitrary CORS access.",
            "The account ID comes from the session, not request input. Missing and another user’s records do not disclose distinguishable ownership details."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "logout",
          "title": "Signing out",
          "paragraphs": [
            "POST /api/auth/logout ends the current session and clears the cookie. Origin and CSRF are required; the body is not read. Telegram /logout also ends all account sessions.",
            "Cookies do not automatically move to another domain. When changing the service domain, update APP_ORIGIN and the bot webhook, then sign in again."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        }
      ],
      "body": "Sign-in uses a short-lived challenge, Telegram confirmation and proof of control of the original browser. A Telegram ID supplied by the client is not proof of identity.\n\nStarting sign-in\n\nPOST /api/auth/telegram/start accepts an empty JSON object {}. It requires the exact application Origin and an available bot. The server creates a challenge lasting 300 seconds and a protected browser-proof cookie.\n\nThe 201 response contains challengeId, code, expiresAt and telegramUrl. The proof cookie is excluded from the deep link and is inaccessible to JavaScript. The limit is six starts per minute per hashed address.\n\nconst response = await fetch('/api/auth/telegram/start', {\n  method: 'POST',\n  headers: { 'Content-Type': 'application/json' },\n  body: '{}'\n});\nconst challenge = await response.json();\n// Show code and telegramUrl to the user.\n\nWaiting for confirmation\n\nPOST /api/auth/telegram/complete accepts {challengeId}. It requires Origin and the original browser-proof cookie. Until confirmation, the response is 202 {status: \"pending\"}.\n\nAfter confirmation, 200 returns status=authenticated, user, csrfToken and expiresAt. A session is issued once. Expired challenges return 410; used or cancelled challenges return 409.\n\nconst response = await fetch('/api/auth/telegram/complete', {\n  method: 'POST',\n  headers: { 'Content-Type': 'application/json' },\n  body: JSON.stringify({ challengeId: challenge.challengeId })\n});\nif (response.status === 202) {\n  // Poll again after a delay; do not create a new challenge.\n}\n\nReading the session\n\nGET /api/auth/me returns 200 {authenticated:false} when no valid session exists. A signed-in response includes the user, CSRF token and expiration.\n\nThe __Host-kevmi-session cookie lasts up to 24 hours with Secure, HttpOnly, SameSite=Lax and Path=/. The database stores a SHA-256 hash of its token. A profile form cannot read or replace the cookie.\n\nAccount changes\n\nMutations require the session, exact Origin and current X-CSRF-Token. Sec-Fetch-Site: cross-site is rejected. The server does not offer arbitrary CORS access.\n\nThe account ID comes from the session, not request input. Missing and another user’s records do not disclose distinguishable ownership details.\n\nSigning out\n\nPOST /api/auth/logout ends the current session and clears the cookie. Origin and CSRF are required; the body is not read. Telegram /logout also ends all account sessions.\n\nCookies do not automatically move to another domain. When changing the service domain, update APP_ORIGIN and the bot webhook, then sign in again.",
      "readMinutes": 3
    },
    {
      "id": "errors",
      "title": "Errors and retries",
      "summary": "API errors use a consistent format. The code is for application logic; the message explains the issue. Keep user input intact and offer a clear next step.",
      "group": "developers",
      "url": "/docs/errors",
      "tags": [
        "error",
        "429",
        "503",
        "retry",
        "status"
      ],
      "sections": [
        {
          "id": "format",
          "title": "One error format",
          "paragraphs": [
            "Responses do not include stack traces, SQL, tokens or a full external provider response. Do not display raw internal logs to a customer."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": {
            "language": "JSON",
            "code": "{\n  \"error\": {\n    \"code\": \"GATEWAY_NOT_CONNECTED\",\n    \"message\": \"Financial operations are temporarily unavailable. Try later or contact support.\"\n  }\n}"
          },
          "note": "",
          "links": []
        },
        {
          "id": "codes",
          "title": "Common error groups",
          "paragraphs": [],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "HTTP",
              "Examples",
              "Next step"
            ],
            "rows": [
              [
                "400",
                "INVALID_JSON, UNKNOWN_FIELD, INVALID_INPUT",
                "Check input and allowed fields"
              ],
              [
                "401",
                "AUTH_REQUIRED, SESSION_EXPIRED",
                "Sign in again"
              ],
              [
                "403",
                "INVALID_ORIGIN, CSRF_REQUIRED",
                "Check origin and current session"
              ],
              [
                "404",
                "NOT_FOUND, TICKET_NOT_FOUND",
                "Check the address and ownership"
              ],
              [
                "409",
                "CHALLENGE_UNAVAILABLE",
                "Start a new sign-in"
              ],
              [
                "410",
                "CHALLENGE_EXPIRED",
                "Create a new sign-in link"
              ],
              [
                "413",
                "REQUEST_TOO_LARGE",
                "Reduce the request body"
              ],
              [
                "415",
                "JSON_REQUIRED",
                "Send application/json"
              ],
              [
                "429",
                "RATE_LIMITED",
                "Reduce frequency and wait"
              ],
              [
                "503",
                "GATEWAY_NOT_CONNECTED, SERVICE_UNAVAILABLE",
                "Check availability or try later"
              ]
            ]
          },
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "rate",
          "title": "Rate limits",
          "paragraphs": [],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Action",
              "Limit"
            ],
            "rows": [
              [
                "Start sign-in",
                "6 per minute per hashed address"
              ],
              [
                "Check a challenge",
                "90 per minute per challenge"
              ],
              [
                "Knowledge question",
                "12 per minute per hashed address with D1"
              ],
              [
                "Create a server link",
                "20 per minute per user"
              ],
              [
                "Merchant API",
                "90 requests per minute per key"
              ],
              [
                "New application",
                "Five per day per user"
              ],
              [
                "Resume application / moderator decision",
                "30 per minute per user for each action"
              ],
              [
                "AI website review",
                "30 per hour service-wide"
              ],
              [
                "Read checkout or attempt payment",
                "90 per minute per hashed address"
              ],
              [
                "Create a support request",
                "6 per hour per user"
              ],
              [
                "Test a notification",
                "3 per hour per user"
              ],
              [
                "AI generation",
                "60 per hour service-wide by default"
              ]
            ]
          },
          "code": null,
          "note": "Retry-After: 60 indicates a delay, not a guarantee that an hourly quota has reset.",
          "links": []
        },
        {
          "id": "retry",
          "title": "What can be retried",
          "paragraphs": [
            "A read can be retried after a delay on a temporary network failure. Before retrying a mutation, check whether the original completed; a lost response does not prove failure.",
            "Financial operations require idempotency and a server status check. A client redirect to a result page is not a substitute for confirmation."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "report",
          "title": "What to include in a request",
          "paragraphs": [],
          "bullets": [
            "The page and action immediately before the error.",
            "Time, time zone and the visible error code.",
            "Your invoice or support-request reference, if available.",
            "A short description of the result you expected."
          ],
          "steps": [],
          "table": null,
          "code": null,
          "note": "Do not attach cookies, tokens, authorization headers, CVV or banking codes.",
          "links": []
        }
      ],
      "body": "API errors use a consistent format. The code is for application logic; the message explains the issue. Keep user input intact and offer a clear next step.\n\nOne error format\n\nResponses do not include stack traces, SQL, tokens or a full external provider response. Do not display raw internal logs to a customer.\n\n{\n  \"error\": {\n    \"code\": \"GATEWAY_NOT_CONNECTED\",\n    \"message\": \"Financial operations are temporarily unavailable. Try later or contact support.\"\n  }\n}\n\nCommon error groups\n\nHTTP · Examples · Next step\n400 · INVALID_JSON, UNKNOWN_FIELD, INVALID_INPUT · Check input and allowed fields\n401 · AUTH_REQUIRED, SESSION_EXPIRED · Sign in again\n403 · INVALID_ORIGIN, CSRF_REQUIRED · Check origin and current session\n404 · NOT_FOUND, TICKET_NOT_FOUND · Check the address and ownership\n409 · CHALLENGE_UNAVAILABLE · Start a new sign-in\n410 · CHALLENGE_EXPIRED · Create a new sign-in link\n413 · REQUEST_TOO_LARGE · Reduce the request body\n415 · JSON_REQUIRED · Send application/json\n429 · RATE_LIMITED · Reduce frequency and wait\n503 · GATEWAY_NOT_CONNECTED, SERVICE_UNAVAILABLE · Check availability or try later\n\nRate limits\n\nAction · Limit\nStart sign-in · 6 per minute per hashed address\nCheck a challenge · 90 per minute per challenge\nKnowledge question · 12 per minute per hashed address with D1\nCreate a server link · 20 per minute per user\nMerchant API · 90 requests per minute per key\nNew application · Five per day per user\nResume application / moderator decision · 30 per minute per user for each action\nAI website review · 30 per hour service-wide\nRead checkout or attempt payment · 90 per minute per hashed address\nCreate a support request · 6 per hour per user\nTest a notification · 3 per hour per user\nAI generation · 60 per hour service-wide by default\n\nRetry-After: 60 indicates a delay, not a guarantee that an hourly quota has reset.\n\nWhat can be retried\n\nA read can be retried after a delay on a temporary network failure. Before retrying a mutation, check whether the original completed; a lost response does not prove failure.\n\nFinancial operations require idempotency and a server status check. A client redirect to a result page is not a substitute for confirmation.\n\nWhat to include in a request\n\nThe page and action immediately before the error.\n\nTime, time zone and the visible error code.\n\nYour invoice or support-request reference, if available.\n\nA short description of the result you expected.\n\nDo not attach cookies, tokens, authorization headers, CVV or banking codes.",
      "readMinutes": 3
    },
    {
      "id": "security",
      "title": "Integration security",
      "summary": "Trusted checks run on the server. The browser controls the interface, but cannot establish identity, financial status or final amounts.",
      "group": "developers",
      "url": "/docs/security",
      "tags": [
        "security",
        "CSRF",
        "cookie",
        "ownership",
        "secret",
        "idempotency"
      ],
      "sections": [
        {
          "id": "identity",
          "title": "Sessions and ownership",
          "paragraphs": [
            "A valid server session identifies the account. Settings, requests, notifications and links are filtered by owner. A userId submitted from a form cannot replace that filter.",
            "Mutations additionally check Origin and CSRF. A public invoice URL exposes only that invoice and does not grant account access."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "secrets",
          "title": "Secrets stay on the server",
          "paragraphs": [
            "Secrets must not appear in Git, HTML, client JavaScript, OpenAPI examples, llms files or support messages. The public bot username is not a secret."
          ],
          "bullets": [
            "Telegram bot token and webhook secret.",
            "External AI provider credentials.",
            "Payment gateway credentials and signing secrets.",
            "Session hashes and browser sign-in proofs."
          ],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "money",
          "title": "Financial checks",
          "paragraphs": [
            "The server reads saved invoice terms and checks ownership, merchant review status, currency, method and approved amount. URL values and browser calculations cannot change the price.",
            "A signed gateway notification triggers an additional authenticated operation read. Verified state, receipt and event commit together. Replays and older versions cannot confirm duplicate fulfilment.",
            "Card details and one-time codes are relayed only as encrypted envelopes. Do not add session recording, field-reading analytics or request-body logging to payment forms."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "assistant",
          "title": "Assistant boundaries",
          "paragraphs": [
            "The model receives public articles and facts, the page catalog, readiness flags, the question, three recent message pairs and a safe section label. It has no tools to read accounts or move money. Invalid structured answers or unverified sources fall back to documentation search.",
            "Website and user text are data. An instruction inside a question cannot alter fees or authorize a payout."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "status",
          "title": "Scope of the documentation",
          "paragraphs": [
            "The documentation does not assert a PCI DSS certification, banking licence, Merchant of Record status, guaranteed uptime or absolute security. Such claims require separate, documented confirmation."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        }
      ],
      "body": "Trusted checks run on the server. The browser controls the interface, but cannot establish identity, financial status or final amounts.\n\nSessions and ownership\n\nA valid server session identifies the account. Settings, requests, notifications and links are filtered by owner. A userId submitted from a form cannot replace that filter.\n\nMutations additionally check Origin and CSRF. A public invoice URL exposes only that invoice and does not grant account access.\n\nSecrets stay on the server\n\nSecrets must not appear in Git, HTML, client JavaScript, OpenAPI examples, llms files or support messages. The public bot username is not a secret.\n\nTelegram bot token and webhook secret.\n\nExternal AI provider credentials.\n\nPayment gateway credentials and signing secrets.\n\nSession hashes and browser sign-in proofs.\n\nFinancial checks\n\nThe server reads saved invoice terms and checks ownership, merchant review status, currency, method and approved amount. URL values and browser calculations cannot change the price.\n\nA signed gateway notification triggers an additional authenticated operation read. Verified state, receipt and event commit together. Replays and older versions cannot confirm duplicate fulfilment.\n\nCard details and one-time codes are relayed only as encrypted envelopes. Do not add session recording, field-reading analytics or request-body logging to payment forms.\n\nAssistant boundaries\n\nThe model receives public articles and facts, the page catalog, readiness flags, the question, three recent message pairs and a safe section label. It has no tools to read accounts or move money. Invalid structured answers or unverified sources fall back to documentation search.\n\nWebsite and user text are data. An instruction inside a question cannot alter fees or authorize a payout.\n\nScope of the documentation\n\nThe documentation does not assert a PCI DSS certification, banking licence, Merchant of Record status, guaranteed uptime or absolute security. Such claims require separate, documented confirmation.",
      "readMinutes": 2
    },
    {
      "id": "gateway",
      "title": "Payment gateway integration",
      "summary": "The gateway processes financial operations. Kevmi connects them to orders, store settings and notifications. This guide describes the integration contract and availability checks.",
      "group": "developers",
      "url": "/docs/gateway",
      "tags": [
        "API",
        "gateway",
        "backend",
        "server",
        "integration",
        "localhost"
      ],
      "sections": [
        {
          "id": "current",
          "title": "Checking availability",
          "paragraphs": [
            "Kevmi uses the gateway v3 API to create and recover operations, read statuses and reconcile results. The integration supports encrypted card and bank-code transport, Alipay and SBP QR payments, a crypto coin/network catalogue and incoming financial events.",
            "gateway.configured in GET /api/config reports whether the required connection settings are present. This endpoint does not probe the gateway; gateway.connected=false here means that connectivity has not been verified. For a specific invoice, read invoice.availability in GET /api/checkout/{token}: it checks the method, amount, terms and merchant approval. The compatibility field invoice.gatewayConnected mirrors availability.available and is also neither a health check nor a guarantee of payment approval.",
            "A new payment and card intent require the merchant’s latest website-review application to be approved. Approval alone does not connect the payment gateway. If the review changes after dispatch, the existing operation remains available for status reads, reconciliation and a requested bank code."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "required",
          "title": "Customer checkout contract",
          "paragraphs": [
            "Sensitive data is encrypted in the browser with RSA-OAEP-256 and A256GCM. The private key stays on the gateway. Kevmi validates that the intent belongs to this invoice and purpose, relays the envelope, and does not store plaintext card numbers, CVV, buyer name, email, bank codes or the envelope itself.",
            "Install the encrypted-transport extension on the gateway host before enabling cards. It checks the intent signature, expiry, replay, order and amounts. There is no plaintext fallback. This describes the protection mechanism, not PCI certification."
          ],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Kevmi route",
              "Purpose"
            ],
            "rows": [
              [
                "GET /api/checkout/{token}",
                "Invoice, quote, method availability and existing payment"
              ],
              [
                "POST /api/checkout/{token}/card-intent",
                "One-time intent and public key for payment or code"
              ],
              [
                "POST /api/checkout/{token}/pay",
                "Start one operation; card uses sealed: {intent,jwe}"
              ],
              [
                "POST /api/checkout/{token}/code",
                "Encrypted one-time code for the current bank challenge"
              ],
              [
                "GET /api/checkout/{token}/status",
                "Read the original operation without another charge"
              ],
              [
                "POST /api/checkout/{token}/reconcile",
                "Explicitly reconcile the original operation"
              ],
              [
                "GET /api/checkout/{token}/crypto-services",
                "Current coins, networks and limits for a USDT invoice"
              ]
            ]
          },
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "network",
          "title": "Hosting and gateway connectivity",
          "paragraphs": [
            "Kevmi supports Sites hosting on Cloudflare Workers with D1, and self-hosting on Node.js with SQLite. SQLite requires a persistent volume and backups. The payment gateway runs as a separate service with its own durable storage.",
            "An external gateway requires an HTTPS origin reachable by the server. In the self-hosted bundle, the server connects to a fixed gateway service on the private container network; the gateway service API is not exposed to the internet. The public site and callbacks use HTTPS. The browser also encrypts card details and bank codes before they reach Kevmi.",
            "localhost refers to the current server or container; it does not expose the gateway owner’s computer. Connection keys and secrets belong only in server configuration.",
            "For a custom domain, set a public HTTPS origin in NEXT_PUBLIC_SITE_URL before building. Documentation, canonical links and indexing resources use this value. It accepts only a scheme and host with an optional port, without a path, query, fragment or credentials. Match it to APP_ORIGIN in server configuration."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "adapter",
          "title": "Calculation and supported terms",
          "paragraphs": [
            "For a new invoice in the interface, USD offers cards and Alipay; RUB offers SBP; USDT offers crypto. The API can also save USD + crypto for compatibility, but its live crypto payment is blocked with crypto_requires_usdt. USD and USDT are distinct, with no automatic conversion or assumed 1:1 rate. A crypto payment requires a separate USDT invoice.",
            "For a new live card or Alipay payment, the current gateway supports only feeCustomerPercent=0 and vatCustomerPercent=100: the merchant covers the entire processing fee and VAT is added in full for the customer. Other shares can be saved and calculated on an invoice, but execution is blocked with unsupported_allocation. The server never silently changes saved terms. SBP and USDT crypto payments support every processing-fee share and have no VAT.",
            "Sending an arbitrary total_cents does not change the provider’s tax calculation. An actual amount that differs from the saved total enters review and cannot confirm fulfilment. Gateway business_balance fields are retained as settlement evidence, not treated as a Kevmi merchant balance."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "activation",
          "title": "Connecting a live gateway",
          "paragraphs": [
            "Connecting the gateway includes server configuration, checks for the selected channels and processing verified financial events. Configuration readiness is checked separately from provider connectivity. A successful payment is accepted after verifying the operation status and amount. Deployment instructions are in ops/gateway-integration.md."
          ],
          "bullets": [],
          "steps": [
            "Deploy the Kevmi server and gateway as separate services. Configure durable storage, backups and the required background processes.",
            "For an external connection, set an HTTPS origin in GATEWAY_BASE_URL. The self-hosted bundle uses its configured internal service. Both require a server-only GATEWAY_API_KEY and a separate GATEWAY_WEBHOOK_SECRET; secrets never reach the browser.",
            "Set gateway BACKEND_WEBHOOK_URL to /api/gateway/webhook on Kevmi and a matching BACKEND_WEBHOOK_SECRET.",
            "Enable encrypted card transport and keep its private key exclusively on the gateway host. Check public-key availability and matching intent-signing settings.",
            "Check channel readiness, restrictions and the merchant website approval before launch."
          ],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Webhooks and repeated events",
              "href": "/docs/webhooks"
            },
            {
              "label": "Security",
              "href": "/docs/security"
            }
          ]
        }
      ],
      "body": "The gateway processes financial operations. Kevmi connects them to orders, store settings and notifications. This guide describes the integration contract and availability checks.\n\nChecking availability\n\nKevmi uses the gateway v3 API to create and recover operations, read statuses and reconcile results. The integration supports encrypted card and bank-code transport, Alipay and SBP QR payments, a crypto coin/network catalogue and incoming financial events.\n\ngateway.configured in GET /api/config reports whether the required connection settings are present. This endpoint does not probe the gateway; gateway.connected=false here means that connectivity has not been verified. For a specific invoice, read invoice.availability in GET /api/checkout/{token}: it checks the method, amount, terms and merchant approval. The compatibility field invoice.gatewayConnected mirrors availability.available and is also neither a health check nor a guarantee of payment approval.\n\nA new payment and card intent require the merchant’s latest website-review application to be approved. Approval alone does not connect the payment gateway. If the review changes after dispatch, the existing operation remains available for status reads, reconciliation and a requested bank code.\n\nCustomer checkout contract\n\nSensitive data is encrypted in the browser with RSA-OAEP-256 and A256GCM. The private key stays on the gateway. Kevmi validates that the intent belongs to this invoice and purpose, relays the envelope, and does not store plaintext card numbers, CVV, buyer name, email, bank codes or the envelope itself.\n\nInstall the encrypted-transport extension on the gateway host before enabling cards. It checks the intent signature, expiry, replay, order and amounts. There is no plaintext fallback. This describes the protection mechanism, not PCI certification.\n\nKevmi route · Purpose\nGET /api/checkout/{token} · Invoice, quote, method availability and existing payment\nPOST /api/checkout/{token}/card-intent · One-time intent and public key for payment or code\nPOST /api/checkout/{token}/pay · Start one operation; card uses sealed: {intent,jwe}\nPOST /api/checkout/{token}/code · Encrypted one-time code for the current bank challenge\nGET /api/checkout/{token}/status · Read the original operation without another charge\nPOST /api/checkout/{token}/reconcile · Explicitly reconcile the original operation\nGET /api/checkout/{token}/crypto-services · Current coins, networks and limits for a USDT invoice\n\nHosting and gateway connectivity\n\nKevmi supports Sites hosting on Cloudflare Workers with D1, and self-hosting on Node.js with SQLite. SQLite requires a persistent volume and backups. The payment gateway runs as a separate service with its own durable storage.\n\nAn external gateway requires an HTTPS origin reachable by the server. In the self-hosted bundle, the server connects to a fixed gateway service on the private container network; the gateway service API is not exposed to the internet. The public site and callbacks use HTTPS. The browser also encrypts card details and bank codes before they reach Kevmi.\n\nlocalhost refers to the current server or container; it does not expose the gateway owner’s computer. Connection keys and secrets belong only in server configuration.\n\nFor a custom domain, set a public HTTPS origin in NEXT_PUBLIC_SITE_URL before building. Documentation, canonical links and indexing resources use this value. It accepts only a scheme and host with an optional port, without a path, query, fragment or credentials. Match it to APP_ORIGIN in server configuration.\n\nCalculation and supported terms\n\nFor a new invoice in the interface, USD offers cards and Alipay; RUB offers SBP; USDT offers crypto. The API can also save USD + crypto for compatibility, but its live crypto payment is blocked with crypto_requires_usdt. USD and USDT are distinct, with no automatic conversion or assumed 1:1 rate. A crypto payment requires a separate USDT invoice.\n\nFor a new live card or Alipay payment, the current gateway supports only feeCustomerPercent=0 and vatCustomerPercent=100: the merchant covers the entire processing fee and VAT is added in full for the customer. Other shares can be saved and calculated on an invoice, but execution is blocked with unsupported_allocation. The server never silently changes saved terms. SBP and USDT crypto payments support every processing-fee share and have no VAT.\n\nSending an arbitrary total_cents does not change the provider’s tax calculation. An actual amount that differs from the saved total enters review and cannot confirm fulfilment. Gateway business_balance fields are retained as settlement evidence, not treated as a Kevmi merchant balance.\n\nConnecting a live gateway\n\nConnecting the gateway includes server configuration, checks for the selected channels and processing verified financial events. Configuration readiness is checked separately from provider connectivity. A successful payment is accepted after verifying the operation status and amount. Deployment instructions are in ops/gateway-integration.md.\n\n1. Deploy the Kevmi server and gateway as separate services. Configure durable storage, backups and the required background processes.\n\n2. For an external connection, set an HTTPS origin in GATEWAY_BASE_URL. The self-hosted bundle uses its configured internal service. Both require a server-only GATEWAY_API_KEY and a separate GATEWAY_WEBHOOK_SECRET; secrets never reach the browser.\n\n3. Set gateway BACKEND_WEBHOOK_URL to /api/gateway/webhook on Kevmi and a matching BACKEND_WEBHOOK_SECRET.\n\n4. Enable encrypted card transport and keep its private key exclusively on the gateway host. Check public-key availability and matching intent-signing settings.\n\n5. Check channel readiness, restrictions and the merchant website approval before launch.\n\nWebhooks and repeated events: https://kevmi.one/en/docs/webhooks\n\nSecurity: https://kevmi.one/en/docs/security",
      "readMinutes": 6
    },
    {
      "id": "webhooks",
      "title": "Webhooks: events, signatures and delivery",
      "summary": "Register a public HTTPS endpoint, prove control and receive signed invoice and payment events. Delivery is queued durably; processing the same event again must be safe for your order.",
      "tags": [
        "webhook",
        "signature",
        "HMAC",
        "idempotency",
        "event",
        "retry"
      ],
      "sections": [
        {
          "id": "sources",
          "title": "Where events come from",
          "paragraphs": [
            "invoice.created does not mean paid. Payment events come from a verified server operation after a current gateway read; an incoming event name alone is insufficient.",
            "Gateway → Kevmi ingress and Kevmi → merchant delivery are different legs with separate secrets. The browser, return navigation and widget messages do not set financial state."
          ],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Event",
              "Source"
            ],
            "rows": [
              [
                "invoice.created",
                "Invoice persisted"
              ],
              [
                "invoice.updated",
                "Link availability changed"
              ],
              [
                "payment.succeeded",
                "Exact payment verified by the server"
              ],
              [
                "payment.failed",
                "Failed operation verified"
              ],
              [
                "payment.refunded",
                "Full refund verified"
              ],
              [
                "payment.partially_refunded",
                "Partial refund verified"
              ],
              [
                "payment.disputed",
                "Dispute verified"
              ],
              [
                "payment.review_required",
                "Operation requires additional review"
              ]
            ]
          },
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "setup",
          "title": "Register and verify an endpoint",
          "paragraphs": [
            "URLs cannot target IP addresses, localhost, private networks, nonstandard ports or contain credentials. DNS is checked before delivery; outbound POST requests do not follow redirects. An account can register up to five endpoints.",
            "The verification event has livemode=false. A successful HTTP status alone is insufficient: the challenge must match exactly. Rotating the secret requires verification again."
          ],
          "bullets": [],
          "steps": [
            "At /account#webhooks in your merchant account, enter a public HTTPS URL, description and the event types you need.",
            "Save the issued secret in server-side storage. Its full value is shown once.",
            "Verify signatures over the original request bytes.",
            "Run endpoint verification. For endpoint.verification, return JSON echoing data.challenge: {\"challenge\":\"the received value\"}.",
            "Enable the verified endpoint and inspect delivery history."
          ],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Webhooks in your account",
              "href": "/account#webhooks"
            }
          ]
        },
        {
          "id": "envelope",
          "title": "Event envelope",
          "paragraphs": [
            "id stays the same across every delivery attempt of an event. createdAt is a Unix timestamp in milliseconds, and apiVersion identifies the contract version. data contains the persisted server object; the example is shortened.",
            "livemode=true distinguishes a real server event from endpoint verification. It does not mean an invoice is paid: check type and payment data. Handle known event types and validate the schema."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": {
            "language": "JSON · shortened example",
            "code": "{\n  \"id\": \"evt_example\",\n  \"type\": \"invoice.created\",\n  \"apiVersion\": \"2026-10-21\",\n  \"createdAt\": 1792540800000,\n  \"livemode\": true,\n  \"data\": {\n    \"invoice\": {\n      \"id\": \"lnk_example\",\n      \"orderId\": \"order-1042\",\n      \"currency\": \"USD\",\n      \"amountMinor\": 500,\n      \"vatCustomerPercent\": 100,\n      \"feeCustomerPercent\": 0\n    }\n  }\n}"
          },
          "note": "",
          "links": []
        },
        {
          "id": "signature",
          "title": "Verify HMAC-SHA256",
          "paragraphs": [
            "Kevmi-Signature contains t=seconds,v1=hex. The signature is HMAC-SHA256 over the timestamp string, a dot and the original body: timestamp + \".\" + rawBody. Use the specific endpoint secret and a constant-time comparison.",
            "Reject signatures whose timestamp differs from server time by more than 300 seconds in either direction. Synchronize clocks. Do not parse and reserialize JSON before verification: whitespace and property order affect the signed bytes."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": {
            "language": "Node.js · verification core",
            "code": "import { createHmac, timingSafeEqual } from 'node:crypto';\n\nfunction verifyKevmi(rawBody, header, secret, nowSeconds) {\n  const match = /^t=(\\d{10}),v1=([a-f0-9]{64})$/.exec(header || '');\n  if (!match || Math.abs(nowSeconds - Number(match[1])) > 300) {\n    return false;\n  }\n  const expected = createHmac('sha256', secret)\n    .update(match[1] + '.')\n    .update(rawBody)\n    .digest();\n  const received = Buffer.from(match[2], 'hex');\n  return expected.length === received.length\n    && timingSafeEqual(expected, received);\n}\n\n// Read bytes before JSON parsing; cap the request body.\n// secret comes from your server secret store.\nconst valid = verifyKevmi(rawBody, signature, secret,\n  Math.floor(Date.now() / 1000));\nif (!valid) throw new Error('Invalid webhook signature');\nconst event = JSON.parse(rawBody.toString('utf8'));\n// Validate the event schema and persist its ID together\n// with your order update in one database transaction.\n// Return a 2xx response after durable acceptance."
          },
          "note": "This example covers signature verification. Your HTTP server also needs a body size limit, schema validation and transactional event persistence.",
          "links": []
        },
        {
          "id": "delivery",
          "title": "Retries and acknowledgement",
          "paragraphs": [
            "Any 2xx response acknowledges an ordinary event. Persist the event durably before responding; expensive work can continue through your own queue. The response timeout is eight seconds. A network error or non-2xx response schedules a retry.",
            "There are at most six attempts: the initial delivery plus delays of one minute, five minutes, 30 minutes, two hours and 12 hours after successive failures. These are queue schedules, not guarantees of exact delivery time. Exhausting attempts marks the delivery failed.",
            "Delivery is at least once and does not promise strict ordering. Persist the unique event ID in the same transaction as your order update. An already applied duplicate should receive 2xx without fulfilling the order again.",
            "A manual retry restarts delivery attempts while preserving the original event ID, delivery ID and exact body. Each attempt gets a fresh signature timestamp. Pausing an endpoint preserves its queue; deleting it cancels pending and failed deliveries."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "reconcile",
          "title": "Delivery history and reconciliation",
          "paragraphs": [
            "The interface shows endpoint state, recent deliveries, attempt counts, last HTTP response, error and next attempt time. These diagnostics complement your own order records.",
            "GET /api/v1/events with events:read returns up to 50 events and nextCursor. Pass the opaque nextCursor unchanged as cursor; null marks the end. Ordering uses both createdAt and id. The legacy before Unix-millisecond boundary remains available separately and cannot be combined with cursor. Verified endpoints receive subscribed events no earlier than their registration; paused endpoints keep accumulating queued events for delivery after resuming. This does not promise history from before endpoint creation."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "API keys and invoice creation",
              "href": "/docs/payment-links-api"
            }
          ]
        },
        {
          "id": "gateway",
          "title": "Incoming gateway receipt checks",
          "paragraphs": [
            "Gateway v3 posts to /api/gateway/webhook with X-Gateway-Event-Id, X-Gateway-Timestamp and X-Gateway-Signature: v1=<hex>. HMAC-SHA256 signs timestamp + \".\" + rawBody with GATEWAY_WEBHOOK_SECRET; the clock window is 300 seconds. Header/body ID equality, API version, live mode and body hash are checked.",
            "An event ID reused with different body bytes is rejected. A signed notification triggers an authenticated GET of the exact operation. Order, method, currency, base, approved total and version are checked. Success requires fulfillment_ready=true, verification=provider_confirmed, the exact paid amount and no dispute; crypto also needs confirmed settlement evidence.",
            "Ingress handling, receipts and merchant events are protected from duplicates. Old browser-only notification formats cannot establish successful payment. Merchant webhooks never contain card fields, bank codes, QR data, provider credentials or the gateway secret."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "telegram",
          "title": "Telegram has a separate contract",
          "paragraphs": [
            "POST /api/telegram/webhook verifies X-Telegram-Bot-Api-Secret-Token, the update structure and sender. update_id protects against duplicate processing. This route handles sign-in, commands, support and moderation actions; it does not accept financial receipts.",
            "The deployment owner configures the bot token, webhook secret, setWebhook registration and reachable HTTPS address. They are separate from the merchant endpoint signing secret."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        }
      ],
      "group": "developers",
      "url": "/docs/webhooks",
      "body": "Register a public HTTPS endpoint, prove control and receive signed invoice and payment events. Delivery is queued durably; processing the same event again must be safe for your order.\n\nWhere events come from\n\ninvoice.created does not mean paid. Payment events come from a verified server operation after a current gateway read; an incoming event name alone is insufficient.\n\nGateway → Kevmi ingress and Kevmi → merchant delivery are different legs with separate secrets. The browser, return navigation and widget messages do not set financial state.\n\nEvent · Source\ninvoice.created · Invoice persisted\ninvoice.updated · Link availability changed\npayment.succeeded · Exact payment verified by the server\npayment.failed · Failed operation verified\npayment.refunded · Full refund verified\npayment.partially_refunded · Partial refund verified\npayment.disputed · Dispute verified\npayment.review_required · Operation requires additional review\n\nRegister and verify an endpoint\n\nURLs cannot target IP addresses, localhost, private networks, nonstandard ports or contain credentials. DNS is checked before delivery; outbound POST requests do not follow redirects. An account can register up to five endpoints.\n\nThe verification event has livemode=false. A successful HTTP status alone is insufficient: the challenge must match exactly. Rotating the secret requires verification again.\n\n1. At /account#webhooks in your merchant account, enter a public HTTPS URL, description and the event types you need.\n\n2. Save the issued secret in server-side storage. Its full value is shown once.\n\n3. Verify signatures over the original request bytes.\n\n4. Run endpoint verification. For endpoint.verification, return JSON echoing data.challenge: {\"challenge\":\"the received value\"}.\n\n5. Enable the verified endpoint and inspect delivery history.\n\nWebhooks in your account: https://kevmi.one/en/account#webhooks\n\nEvent envelope\n\nid stays the same across every delivery attempt of an event. createdAt is a Unix timestamp in milliseconds, and apiVersion identifies the contract version. data contains the persisted server object; the example is shortened.\n\nlivemode=true distinguishes a real server event from endpoint verification. It does not mean an invoice is paid: check type and payment data. Handle known event types and validate the schema.\n\n{\n  \"id\": \"evt_example\",\n  \"type\": \"invoice.created\",\n  \"apiVersion\": \"2026-10-21\",\n  \"createdAt\": 1792540800000,\n  \"livemode\": true,\n  \"data\": {\n    \"invoice\": {\n      \"id\": \"lnk_example\",\n      \"orderId\": \"order-1042\",\n      \"currency\": \"USD\",\n      \"amountMinor\": 500,\n      \"vatCustomerPercent\": 100,\n      \"feeCustomerPercent\": 0\n    }\n  }\n}\n\nVerify HMAC-SHA256\n\nKevmi-Signature contains t=seconds,v1=hex. The signature is HMAC-SHA256 over the timestamp string, a dot and the original body: timestamp + \".\" + rawBody. Use the specific endpoint secret and a constant-time comparison.\n\nReject signatures whose timestamp differs from server time by more than 300 seconds in either direction. Synchronize clocks. Do not parse and reserialize JSON before verification: whitespace and property order affect the signed bytes.\n\nimport { createHmac, timingSafeEqual } from 'node:crypto';\n\nfunction verifyKevmi(rawBody, header, secret, nowSeconds) {\n  const match = /^t=(\\d{10}),v1=([a-f0-9]{64})$/.exec(header || '');\n  if (!match || Math.abs(nowSeconds - Number(match[1])) > 300) {\n    return false;\n  }\n  const expected = createHmac('sha256', secret)\n    .update(match[1] + '.')\n    .update(rawBody)\n    .digest();\n  const received = Buffer.from(match[2], 'hex');\n  return expected.length === received.length\n    && timingSafeEqual(expected, received);\n}\n\n// Read bytes before JSON parsing; cap the request body.\n// secret comes from your server secret store.\nconst valid = verifyKevmi(rawBody, signature, secret,\n  Math.floor(Date.now() / 1000));\nif (!valid) throw new Error('Invalid webhook signature');\nconst event = JSON.parse(rawBody.toString('utf8'));\n// Validate the event schema and persist its ID together\n// with your order update in one database transaction.\n// Return a 2xx response after durable acceptance.\n\nThis example covers signature verification. Your HTTP server also needs a body size limit, schema validation and transactional event persistence.\n\nRetries and acknowledgement\n\nAny 2xx response acknowledges an ordinary event. Persist the event durably before responding; expensive work can continue through your own queue. The response timeout is eight seconds. A network error or non-2xx response schedules a retry.\n\nThere are at most six attempts: the initial delivery plus delays of one minute, five minutes, 30 minutes, two hours and 12 hours after successive failures. These are queue schedules, not guarantees of exact delivery time. Exhausting attempts marks the delivery failed.\n\nDelivery is at least once and does not promise strict ordering. Persist the unique event ID in the same transaction as your order update. An already applied duplicate should receive 2xx without fulfilling the order again.\n\nA manual retry restarts delivery attempts while preserving the original event ID, delivery ID and exact body. Each attempt gets a fresh signature timestamp. Pausing an endpoint preserves its queue; deleting it cancels pending and failed deliveries.\n\nDelivery history and reconciliation\n\nThe interface shows endpoint state, recent deliveries, attempt counts, last HTTP response, error and next attempt time. These diagnostics complement your own order records.\n\nGET /api/v1/events with events:read returns up to 50 events and nextCursor. Pass the opaque nextCursor unchanged as cursor; null marks the end. Ordering uses both createdAt and id. The legacy before Unix-millisecond boundary remains available separately and cannot be combined with cursor. Verified endpoints receive subscribed events no earlier than their registration; paused endpoints keep accumulating queued events for delivery after resuming. This does not promise history from before endpoint creation.\n\nAPI keys and invoice creation: https://kevmi.one/en/docs/payment-links-api\n\nIncoming gateway receipt checks\n\nGateway v3 posts to /api/gateway/webhook with X-Gateway-Event-Id, X-Gateway-Timestamp and X-Gateway-Signature: v1=<hex>. HMAC-SHA256 signs timestamp + \".\" + rawBody with GATEWAY_WEBHOOK_SECRET; the clock window is 300 seconds. Header/body ID equality, API version, live mode and body hash are checked.\n\nAn event ID reused with different body bytes is rejected. A signed notification triggers an authenticated GET of the exact operation. Order, method, currency, base, approved total and version are checked. Success requires fulfillment_ready=true, verification=provider_confirmed, the exact paid amount and no dispute; crypto also needs confirmed settlement evidence.\n\nIngress handling, receipts and merchant events are protected from duplicates. Old browser-only notification formats cannot establish successful payment. Merchant webhooks never contain card fields, bank codes, QR data, provider credentials or the gateway secret.\n\nTelegram has a separate contract\n\nPOST /api/telegram/webhook verifies X-Telegram-Bot-Api-Secret-Token, the update structure and sender. update_id protects against duplicate processing. This route handles sign-in, commands, support and moderation actions; it does not accept financial receipts.\n\nThe deployment owner configures the bot token, webhook secret, setWebhook registration and reachable HTTPS address. They are separate from the merchant endpoint signing secret.",
      "readMinutes": 7
    },
    {
      "id": "limits",
      "title": "Limits and availability",
      "summary": "Payment availability depends on method, amount, country and the terms of a particular invoice. Check the total, restrictions and applicable processing time before confirmation.",
      "group": "payments",
      "url": "/docs/limits",
      "tags": [
        "limit",
        "processing time",
        "hold",
        "refund",
        "chargeback",
        "restriction"
      ],
      "sections": [
        {
          "id": "pending",
          "title": "Adapter and channel limits",
          "paragraphs": [
            "Kevmi checks the ranges below before creating an operation. A payment channel may impose additional restrictions; an amount within range does not guarantee approval. Changing gateway configuration does not automatically change Kevmi limits.",
            "A new payment and card intent require the merchant’s latest website-review application to be approved. Approval alone does not connect the payment gateway. If the review changes after dispatch, the existing operation remains available for status reads, reconciliation and a requested bank code."
          ],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Method",
              "Amount checked",
              "Kevmi range"
            ],
            "rows": [
              [
                "Card / Alipay",
                "USD base price",
                "$1–$1,000"
              ],
              [
                "SBP",
                "RUB customer total",
                "₽1–₽100,000"
              ],
              [
                "Crypto",
                "USDT customer total",
                "1–1,000,000 USDT + selected network limits"
              ]
            ]
          },
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "validation",
          "title": "Validation is not a commercial limit",
          "paragraphs": [
            "The calculator and API reject negative amounts, invalid currencies and calculations where the merchant’s allocated fee and VAT exceed the base amount. These checks protect data correctness.",
            "Passing arithmetic validation does not guarantee that a provider can accept the payment. Commercial and risk limits are checked separately by the payment channel."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "refunds",
          "title": "Refunds and disputed transactions",
          "paragraphs": [
            "Verified refunds, partial refunds, disputes and review states appear in the operation and merchant events. This does not imply that creating a refund or payout is implemented in the account.",
            "Do not fulfil again for payment.partially_refunded, payment.refunded, payment.disputed or payment.review_required. Preserve the original order/payment association and route disputed cases to an authorized operator."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "subscriptions",
          "title": "Recurring charges",
          "paragraphs": [
            "Kevmi has no subscriptions or recurring payments. Saving an order link does not authorize an automatic future charge. Each new order is paid separately."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "ready",
          "title": "Readiness checks",
          "paragraphs": [
            "gateway.configured in /api/config reports the required gateway settings, while /api/health checks server storage. Neither establishes connectivity to a payment provider. Use invoice.availability in GET /api/checkout/{token} for a specific invoice’s terms; payment success is verified separately against the gateway operation."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Integration requirements",
              "href": "/docs/gateway"
            },
            {
              "label": "Ask about your use case",
              "href": "/?support=open"
            }
          ]
        }
      ],
      "body": "Payment availability depends on method, amount, country and the terms of a particular invoice. Check the total, restrictions and applicable processing time before confirmation.\n\nAdapter and channel limits\n\nKevmi checks the ranges below before creating an operation. A payment channel may impose additional restrictions; an amount within range does not guarantee approval. Changing gateway configuration does not automatically change Kevmi limits.\n\nA new payment and card intent require the merchant’s latest website-review application to be approved. Approval alone does not connect the payment gateway. If the review changes after dispatch, the existing operation remains available for status reads, reconciliation and a requested bank code.\n\nMethod · Amount checked · Kevmi range\nCard / Alipay · USD base price · $1–$1,000\nSBP · RUB customer total · ₽1–₽100,000\nCrypto · USDT customer total · 1–1,000,000 USDT + selected network limits\n\nValidation is not a commercial limit\n\nThe calculator and API reject negative amounts, invalid currencies and calculations where the merchant’s allocated fee and VAT exceed the base amount. These checks protect data correctness.\n\nPassing arithmetic validation does not guarantee that a provider can accept the payment. Commercial and risk limits are checked separately by the payment channel.\n\nRefunds and disputed transactions\n\nVerified refunds, partial refunds, disputes and review states appear in the operation and merchant events. This does not imply that creating a refund or payout is implemented in the account.\n\nDo not fulfil again for payment.partially_refunded, payment.refunded, payment.disputed or payment.review_required. Preserve the original order/payment association and route disputed cases to an authorized operator.\n\nRecurring charges\n\nKevmi has no subscriptions or recurring payments. Saving an order link does not authorize an automatic future charge. Each new order is paid separately.\n\nReadiness checks\n\ngateway.configured in /api/config reports the required gateway settings, while /api/health checks server storage. Neither establishes connectivity to a payment provider. Use invoice.availability in GET /api/checkout/{token} for a specific invoice’s terms; payment success is verified separately against the gateway operation.\n\nIntegration requirements: https://kevmi.one/en/docs/gateway\n\nAsk about your use case: https://kevmi.one/en?support=open",
      "readMinutes": 3
    },
    {
      "id": "agent-access",
      "title": "Resources for search engines and AI",
      "summary": "Public Kevmi information is available in server-rendered HTML, plain text and structured formats. These formats share one knowledge version and the same commercial facts.",
      "group": "developers",
      "url": "/docs/agent-access",
      "tags": [
        "SEO",
        "indexing",
        "llms",
        "robots",
        "sitemap",
        "agent",
        "JSON"
      ],
      "sections": [
        {
          "id": "files",
          "title": "Public resources",
          "paragraphs": [],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Address",
              "Contents"
            ],
            "rows": [
              [
                "/docs and /en/docs",
                "Full Russian and English guide editions"
              ],
              [
                "/llms.txt",
                "English index and core facts"
              ],
              [
                "/llms-full.txt",
                "Complete English knowledge text"
              ],
              [
                "/knowledge.json",
                "Facts, fees, articles and version"
              ],
              [
                "/openapi.json",
                "Implemented server API contract"
              ],
              [
                "/sitemap.xml",
                "Published public pages"
              ],
              [
                "/robots.txt",
                "Crawler directives"
              ]
            ]
          },
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "facts",
          "title": "Reading structured facts",
          "paragraphs": [
            "knowledge.facts.countries.card describes worldwide coverage with explicit restrictions. countryCount counts directory entries, coverageLabel is 190+, and exactList contains supported ISO entries. restrictions preserves the provider exclusion list.",
            "source=owner_provided and status=owner_list_received record the origin of the list. independentlyVerified=false and verifiedCountryCount=null mean the list has not been independently checked against a live gateway; it is still a received and published list.",
            "partialCoverage contains ** countries with incomplete location coverage. unresolvedFootnotes preserves the separate * marker for China. coverage=listed means inclusion in the list; partial_locations denotes location restrictions; footnote_pending denotes the separate unconfirmed meaning of a marker. None guarantees approval of every card.",
            "gatewayConnected=null and gatewayIntegration.liveConfigurationProvided=null mean that the static knowledge base does not contain a deployment’s current state. gatewayIntegration.availability identifies the endpoints for current checks. gateway.configured in /api/config reports settings, not provider connectivity. invoice.availability in the checkout response describes eligible invoice terms, while the compatibility field invoice.gatewayConnected mirrors availability.available. Neither replaces operation confirmation. gatewayIntegration.adapterImplemented=true describes v3 protocol support; subscriptionsSupported=false excludes recurring charges."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": {
            "language": "JSON · fact excerpt",
            "code": "{\n  \"subscriptionsSupported\": false,\n  \"gatewayConnected\": null,\n  \"countries\": {\n    \"card\": {\n      \"coverageLabel\": \"190+\",\n      \"policy\": \"worldwide_except_restrictions\",\n      \"restrictions\": [\n        {\n          \"code\": \"AF\",\n          \"name\": \"Afghanistan\"\n        },\n        {\n          \"code\": \"AQ\",\n          \"name\": \"Antarctica\"\n        },\n        {\n          \"code\": \"BY\",\n          \"name\": \"Belarus\"\n        },\n        {\n          \"code\": \"MM\",\n          \"name\": \"Burma (Myanmar)\"\n        },\n        {\n          \"code\": \"BI\",\n          \"name\": \"Burundi\"\n        },\n        {\n          \"code\": \"CF\",\n          \"name\": \"Central African Republic\"\n        },\n        {\n          \"code\": \"TD\",\n          \"name\": \"Chad\"\n        },\n        {\n          \"code\": \"CU\",\n          \"name\": \"Cuba\"\n        },\n        {\n          \"code\": \"CD\",\n          \"name\": \"Democratic Republic of Congo\"\n        },\n        {\n          \"code\": \"CG\",\n          \"name\": \"Republic of Congo\"\n        },\n        {\n          \"code\": \"ER\",\n          \"name\": \"Eritrea\"\n        },\n        {\n          \"code\": \"HT\",\n          \"name\": \"Haiti\"\n        },\n        {\n          \"code\": \"IR\",\n          \"name\": \"Iran\"\n        },\n        {\n          \"code\": \"IQ\",\n          \"name\": \"Iraq\"\n        },\n        {\n          \"code\": \"LY\",\n          \"name\": \"Libya\"\n        },\n        {\n          \"code\": \"ML\",\n          \"name\": \"Mali\"\n        },\n        {\n          \"code\": \"NI\",\n          \"name\": \"Nicaragua\"\n        },\n        {\n          \"code\": \"KP\",\n          \"name\": \"North Korea\"\n        },\n        {\n          \"code\": \"RU\",\n          \"name\": \"Russia\"\n        },\n        {\n          \"code\": \"SO\",\n          \"name\": \"Somalia\"\n        },\n        {\n          \"code\": \"SS\",\n          \"name\": \"South Sudan\"\n        },\n        {\n          \"code\": \"SD\",\n          \"name\": \"Sudan\"\n        },\n        {\n          \"code\": \"SY\",\n          \"name\": \"Syria\"\n        },\n        {\n          \"code\": \"VE\",\n          \"name\": \"Venezuela\"\n        },\n        {\n          \"code\": \"YE\",\n          \"name\": \"Yemen\"\n        },\n        {\n          \"code\": \"ZW\",\n          \"name\": \"Zimbabwe\"\n        },\n        {\n          \"code\": \"UA-43\",\n          \"name\": \"Crimea (Region of Ukraine)\"\n        },\n        {\n          \"code\": \"UA-14\",\n          \"name\": \"Donetsk (Region of Ukraine)\"\n        },\n        {\n          \"code\": \"UA-65\",\n          \"name\": \"Kherson (Region of Ukraine)\"\n        },\n        {\n          \"code\": \"UA-09\",\n          \"name\": \"Luhansk (Region of Ukraine)\"\n        },\n        {\n          \"code\": \"UA-23\",\n          \"name\": \"Zaporizhzhia (Region of Ukraine)\"\n        },\n        {\n          \"code\": \"AN\",\n          \"name\": \"Netherlands Antilles\"\n        }\n      ],\n      \"independentlyVerified\": false,\n      \"approvalGuaranteed\": false\n    }\n  },\n  \"gatewayIntegration\": {\n    \"adapterImplemented\": true,\n    \"contract\": \"v3\",\n    \"liveConfigurationProvided\": null,\n    \"availability\": {\n      \"source\": \"runtime\",\n      \"configurationEndpoint\": \"/api/config\",\n      \"configurationIncludesHealthCheck\": false,\n      \"checkoutEndpoint\": \"/api/checkout/{token}\",\n      \"checkoutIncludesProviderApproval\": false\n    }\n  }\n}"
          },
          "note": "",
          "links": []
        },
        {
          "id": "privacy",
          "title": "Public information boundaries",
          "paragraphs": [
            "Plain text and JSON do not contain sessions, tokens, private support requests, user payment records or integration secrets. Sign-in, account and checkout pages are excluded from search indexing.",
            "Reading public documentation does not grant store-management permissions. Personal records require a valid session and mutations require additional server checks."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "updates",
          "title": "Updates and citations",
          "paragraphs": [
            "Articles have stable IDs, URLs, titles and an update date. Link to the relevant guide when citing an answer and preserve qualifications about transaction conditions.",
            "Sitemaps, llms resources and server-rendered HTML make content easier to extract. They do not guarantee indexing, search position or use by an external AI system.",
            "Only published translations have canonical URLs, hreflang alternates and sitemap entries. A locale configured for future translation is not a published language edition."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        }
      ],
      "body": "Public Kevmi information is available in server-rendered HTML, plain text and structured formats. These formats share one knowledge version and the same commercial facts.\n\nPublic resources\n\nAddress · Contents\n/docs and /en/docs · Full Russian and English guide editions\n/llms.txt · English index and core facts\n/llms-full.txt · Complete English knowledge text\n/knowledge.json · Facts, fees, articles and version\n/openapi.json · Implemented server API contract\n/sitemap.xml · Published public pages\n/robots.txt · Crawler directives\n\nReading structured facts\n\nknowledge.facts.countries.card describes worldwide coverage with explicit restrictions. countryCount counts directory entries, coverageLabel is 190+, and exactList contains supported ISO entries. restrictions preserves the provider exclusion list.\n\nsource=owner_provided and status=owner_list_received record the origin of the list. independentlyVerified=false and verifiedCountryCount=null mean the list has not been independently checked against a live gateway; it is still a received and published list.\n\npartialCoverage contains ** countries with incomplete location coverage. unresolvedFootnotes preserves the separate * marker for China. coverage=listed means inclusion in the list; partial_locations denotes location restrictions; footnote_pending denotes the separate unconfirmed meaning of a marker. None guarantees approval of every card.\n\ngatewayConnected=null and gatewayIntegration.liveConfigurationProvided=null mean that the static knowledge base does not contain a deployment’s current state. gatewayIntegration.availability identifies the endpoints for current checks. gateway.configured in /api/config reports settings, not provider connectivity. invoice.availability in the checkout response describes eligible invoice terms, while the compatibility field invoice.gatewayConnected mirrors availability.available. Neither replaces operation confirmation. gatewayIntegration.adapterImplemented=true describes v3 protocol support; subscriptionsSupported=false excludes recurring charges.\n\n{\n  \"subscriptionsSupported\": false,\n  \"gatewayConnected\": null,\n  \"countries\": {\n    \"card\": {\n      \"coverageLabel\": \"190+\",\n      \"policy\": \"worldwide_except_restrictions\",\n      \"restrictions\": [\n        {\n          \"code\": \"AF\",\n          \"name\": \"Afghanistan\"\n        },\n        {\n          \"code\": \"AQ\",\n          \"name\": \"Antarctica\"\n        },\n        {\n          \"code\": \"BY\",\n          \"name\": \"Belarus\"\n        },\n        {\n          \"code\": \"MM\",\n          \"name\": \"Burma (Myanmar)\"\n        },\n        {\n          \"code\": \"BI\",\n          \"name\": \"Burundi\"\n        },\n        {\n          \"code\": \"CF\",\n          \"name\": \"Central African Republic\"\n        },\n        {\n          \"code\": \"TD\",\n          \"name\": \"Chad\"\n        },\n        {\n          \"code\": \"CU\",\n          \"name\": \"Cuba\"\n        },\n        {\n          \"code\": \"CD\",\n          \"name\": \"Democratic Republic of Congo\"\n        },\n        {\n          \"code\": \"CG\",\n          \"name\": \"Republic of Congo\"\n        },\n        {\n          \"code\": \"ER\",\n          \"name\": \"Eritrea\"\n        },\n        {\n          \"code\": \"HT\",\n          \"name\": \"Haiti\"\n        },\n        {\n          \"code\": \"IR\",\n          \"name\": \"Iran\"\n        },\n        {\n          \"code\": \"IQ\",\n          \"name\": \"Iraq\"\n        },\n        {\n          \"code\": \"LY\",\n          \"name\": \"Libya\"\n        },\n        {\n          \"code\": \"ML\",\n          \"name\": \"Mali\"\n        },\n        {\n          \"code\": \"NI\",\n          \"name\": \"Nicaragua\"\n        },\n        {\n          \"code\": \"KP\",\n          \"name\": \"North Korea\"\n        },\n        {\n          \"code\": \"RU\",\n          \"name\": \"Russia\"\n        },\n        {\n          \"code\": \"SO\",\n          \"name\": \"Somalia\"\n        },\n        {\n          \"code\": \"SS\",\n          \"name\": \"South Sudan\"\n        },\n        {\n          \"code\": \"SD\",\n          \"name\": \"Sudan\"\n        },\n        {\n          \"code\": \"SY\",\n          \"name\": \"Syria\"\n        },\n        {\n          \"code\": \"VE\",\n          \"name\": \"Venezuela\"\n        },\n        {\n          \"code\": \"YE\",\n          \"name\": \"Yemen\"\n        },\n        {\n          \"code\": \"ZW\",\n          \"name\": \"Zimbabwe\"\n        },\n        {\n          \"code\": \"UA-43\",\n          \"name\": \"Crimea (Region of Ukraine)\"\n        },\n        {\n          \"code\": \"UA-14\",\n          \"name\": \"Donetsk (Region of Ukraine)\"\n        },\n        {\n          \"code\": \"UA-65\",\n          \"name\": \"Kherson (Region of Ukraine)\"\n        },\n        {\n          \"code\": \"UA-09\",\n          \"name\": \"Luhansk (Region of Ukraine)\"\n        },\n        {\n          \"code\": \"UA-23\",\n          \"name\": \"Zaporizhzhia (Region of Ukraine)\"\n        },\n        {\n          \"code\": \"AN\",\n          \"name\": \"Netherlands Antilles\"\n        }\n      ],\n      \"independentlyVerified\": false,\n      \"approvalGuaranteed\": false\n    }\n  },\n  \"gatewayIntegration\": {\n    \"adapterImplemented\": true,\n    \"contract\": \"v3\",\n    \"liveConfigurationProvided\": null,\n    \"availability\": {\n      \"source\": \"runtime\",\n      \"configurationEndpoint\": \"/api/config\",\n      \"configurationIncludesHealthCheck\": false,\n      \"checkoutEndpoint\": \"/api/checkout/{token}\",\n      \"checkoutIncludesProviderApproval\": false\n    }\n  }\n}\n\nPublic information boundaries\n\nPlain text and JSON do not contain sessions, tokens, private support requests, user payment records or integration secrets. Sign-in, account and checkout pages are excluded from search indexing.\n\nReading public documentation does not grant store-management permissions. Personal records require a valid session and mutations require additional server checks.\n\nUpdates and citations\n\nArticles have stable IDs, URLs, titles and an update date. Link to the relevant guide when citing an answer and preserve qualifications about transaction conditions.\n\nSitemaps, llms resources and server-rendered HTML make content easier to extract. They do not guarantee indexing, search position or use by an external AI system.\n\nOnly published translations have canonical URLs, hreflang alternates and sitemap entries. A locale configured for future translation is not a published language edition.",
      "readMinutes": 5
    },
    {
      "id": "cost-sharing",
      "title": "Split processing fees and VAT",
      "summary": "Choose independently how much of the processing fee and VAT your customer pays on each invoice. Two sliders allocate each cost from 0 to 100% in one-percent steps, with the result visible before you create the link.",
      "tags": [
        "cost sharing",
        "processing fee",
        "VAT",
        "percentage",
        "slider",
        "feeCustomerPercent",
        "vatCustomerPercent"
      ],
      "sections": [
        {
          "id": "controls",
          "title": "Two controls for one order",
          "paragraphs": [
            "The processing fee control allocates the whole acceptance fee, including both its percentage and fixed components. The VAT control allocates only tax. Neither control changes the tariff, tax rate or base product price.",
            "Fully left assigns the cost to the customer; fully right assigns it to the merchant. Labels show both parties’ exact percentages and monetary amounts. Customer, Split equally and Merchant presets provide a quick choice."
          ],
          "bullets": [
            "The customer share is added to the checkout total.",
            "The merchant share is deducted from the base order price.",
            "SBP and cryptocurrency have zero VAT, so the VAT control does not affect their total.",
            "Buttons and sliders work with the keyboard; animation is not needed to understand the result."
          ],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Open the calculator",
              "href": "/pricing"
            }
          ]
        },
        {
          "id": "base",
          "title": "One base price, two separate costs",
          "paragraphs": [
            "International cards and Alipay cost 10% of the base price plus $0.50, with VAT of 16% of the base price. SBP costs 8% and cryptocurrency costs 4%; neither has VAT under the published pricing model.",
            "VAT is added from the base price, not extracted using 16/116. The fee is not recalculated on a total that includes VAT or the customer fee share. Kevmi’s commission is already included in the published tariff; another 5% is not added."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": {
            "language": "Formula · integer minor units",
            "code": "fee = roundHalfUp(base × rate / 100) + fixed\nvat = vatApplies ? roundHalfUp(base × 16 / 100) : 0\ncustomerFee = roundHalfUp(fee × feeCustomerPercent / 100)\ncustomerVat = roundHalfUp(vat × vatCustomerPercent / 100)\nmerchantFee = fee − customerFee\nmerchantVat = vat − customerVat\ncustomerTotal = base + customerFee + customerVat\nmerchantNet = base − merchantFee − merchantVat"
          },
          "note": "",
          "links": []
        },
        {
          "id": "example",
          "title": "Allocating a $5 card order",
          "paragraphs": [
            "Every example below uses a $5.00 base price, a $1.00 total card fee and $0.80 VAT. The percentages change only who covers those costs."
          ],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Customer shares: VAT / fee",
              "Customer pays",
              "Merchant after deductions"
            ],
            "rows": [
              [
                "100% / 0% · original default",
                "$5.80",
                "$4.00"
              ],
              [
                "0% / 0% · merchant covers all",
                "$5.00",
                "$3.20"
              ],
              [
                "100% / 100% · customer covers all",
                "$6.80",
                "$5.00"
              ],
              [
                "50% / 23% · custom split",
                "$5.63",
                "$3.83"
              ]
            ]
          },
          "code": null,
          "note": "The table illustrates allocation arithmetic. Of these card configurations, the current gateway can execute only 100% customer VAT / 0% customer fee. This calculation does not initiate a payout; there is no automatic USD-to-USDT conversion.",
          "links": []
        },
        {
          "id": "rounding",
          "title": "Rounding without losing a cent",
          "paragraphs": [
            "Amounts are integer minor currency units. The total fee and total VAT are rounded separately first. Each customer share then uses half-up rounding, and the merchant receives the exact remainder of that cost. The two shares therefore always add up to the original amount.",
            "For a one-cent cost split 50/50, the customer is allocated one cent and the merchant zero. The percentage remains 50%, while monetary amounts reflect the currency’s available precision. The server rejects calculations with negative merchant proceeds."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "api",
          "title": "Set the split through the API",
          "paragraphs": [
            "Send vatCustomerPercent and feeCustomerPercent as integers from 0 to 100. Each applies to the invoice being created. Empty strings, fractional percentages and out-of-range numbers are rejected.",
            "Omitting feeCustomerPercent assigns the whole fee to the merchant. Omitting vatCustomerPercent uses the legacy vatPayer field or the account default. Legacy customer and merchant values correspond to 100% and 0% customer VAT. Do not send conflicting vatPayer and vatCustomerPercent values.",
            "Responses describe an intermediate VAT share as vatPayer=shared. Use the numerical percentage for new requests; shared is not accepted as the legacy vatPayer input value."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": {
            "language": "JSON",
            "code": "{\n  \"title\": \"Design project · order 1042\",\n  \"description\": \"One-time payment for the agreed design work\",\n  \"amountMinor\": 500,\n  \"currency\": \"USD\",\n  \"methods\": [\n    \"card\",\n    \"alipay\"\n  ],\n  \"vatCustomerPercent\": 100,\n  \"feeCustomerPercent\": 0,\n  \"orderId\": \"order-1042\",\n  \"metadata\": {\n    \"campaign\": \"autumn\"\n  }\n}"
          },
          "note": "The example uses the card channel’s supported allocation: all VAT to the customer and the full processing fee to the merchant. Saving other percentages does not make them executable.",
          "links": [
            {
              "label": "Create an invoice through the API",
              "href": "/docs/payment-links-api"
            }
          ]
        },
        {
          "id": "snapshot",
          "title": "Terms stay with the invoice",
          "paragraphs": [
            "The invoice freezes the amount, currency, methods and both shares. Changing store preferences does not modify issued links. Sliders calculate the allocation; live execution depends on the connected channel’s capabilities.",
            "For a new live card or Alipay payment, the current gateway supports only feeCustomerPercent=0 and vatCustomerPercent=100: the merchant covers the entire processing fee and VAT is added in full for the customer. Other shares can be saved and calculated on an invoice, but execution is blocked with unsupported_allocation. The server never silently changes saved terms. SBP and USDT crypto payments support every processing-fee share and have no VAT."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        }
      ],
      "group": "payments",
      "url": "/docs/cost-sharing",
      "body": "Choose independently how much of the processing fee and VAT your customer pays on each invoice. Two sliders allocate each cost from 0 to 100% in one-percent steps, with the result visible before you create the link.\n\nTwo controls for one order\n\nThe processing fee control allocates the whole acceptance fee, including both its percentage and fixed components. The VAT control allocates only tax. Neither control changes the tariff, tax rate or base product price.\n\nFully left assigns the cost to the customer; fully right assigns it to the merchant. Labels show both parties’ exact percentages and monetary amounts. Customer, Split equally and Merchant presets provide a quick choice.\n\nThe customer share is added to the checkout total.\n\nThe merchant share is deducted from the base order price.\n\nSBP and cryptocurrency have zero VAT, so the VAT control does not affect their total.\n\nButtons and sliders work with the keyboard; animation is not needed to understand the result.\n\nOpen the calculator: https://kevmi.one/en/pricing\n\nOne base price, two separate costs\n\nInternational cards and Alipay cost 10% of the base price plus $0.50, with VAT of 16% of the base price. SBP costs 8% and cryptocurrency costs 4%; neither has VAT under the published pricing model.\n\nVAT is added from the base price, not extracted using 16/116. The fee is not recalculated on a total that includes VAT or the customer fee share. Kevmi’s commission is already included in the published tariff; another 5% is not added.\n\nfee = roundHalfUp(base × rate / 100) + fixed\nvat = vatApplies ? roundHalfUp(base × 16 / 100) : 0\ncustomerFee = roundHalfUp(fee × feeCustomerPercent / 100)\ncustomerVat = roundHalfUp(vat × vatCustomerPercent / 100)\nmerchantFee = fee − customerFee\nmerchantVat = vat − customerVat\ncustomerTotal = base + customerFee + customerVat\nmerchantNet = base − merchantFee − merchantVat\n\nAllocating a $5 card order\n\nEvery example below uses a $5.00 base price, a $1.00 total card fee and $0.80 VAT. The percentages change only who covers those costs.\n\nCustomer shares: VAT / fee · Customer pays · Merchant after deductions\n100% / 0% · original default · $5.80 · $4.00\n0% / 0% · merchant covers all · $5.00 · $3.20\n100% / 100% · customer covers all · $6.80 · $5.00\n50% / 23% · custom split · $5.63 · $3.83\n\nThe table illustrates allocation arithmetic. Of these card configurations, the current gateway can execute only 100% customer VAT / 0% customer fee. This calculation does not initiate a payout; there is no automatic USD-to-USDT conversion.\n\nRounding without losing a cent\n\nAmounts are integer minor currency units. The total fee and total VAT are rounded separately first. Each customer share then uses half-up rounding, and the merchant receives the exact remainder of that cost. The two shares therefore always add up to the original amount.\n\nFor a one-cent cost split 50/50, the customer is allocated one cent and the merchant zero. The percentage remains 50%, while monetary amounts reflect the currency’s available precision. The server rejects calculations with negative merchant proceeds.\n\nSet the split through the API\n\nSend vatCustomerPercent and feeCustomerPercent as integers from 0 to 100. Each applies to the invoice being created. Empty strings, fractional percentages and out-of-range numbers are rejected.\n\nOmitting feeCustomerPercent assigns the whole fee to the merchant. Omitting vatCustomerPercent uses the legacy vatPayer field or the account default. Legacy customer and merchant values correspond to 100% and 0% customer VAT. Do not send conflicting vatPayer and vatCustomerPercent values.\n\nResponses describe an intermediate VAT share as vatPayer=shared. Use the numerical percentage for new requests; shared is not accepted as the legacy vatPayer input value.\n\n{\n  \"title\": \"Design project · order 1042\",\n  \"description\": \"One-time payment for the agreed design work\",\n  \"amountMinor\": 500,\n  \"currency\": \"USD\",\n  \"methods\": [\n    \"card\",\n    \"alipay\"\n  ],\n  \"vatCustomerPercent\": 100,\n  \"feeCustomerPercent\": 0,\n  \"orderId\": \"order-1042\",\n  \"metadata\": {\n    \"campaign\": \"autumn\"\n  }\n}\n\nThe example uses the card channel’s supported allocation: all VAT to the customer and the full processing fee to the merchant. Saving other percentages does not make them executable.\n\nCreate an invoice through the API: https://kevmi.one/en/docs/payment-links-api\n\nTerms stay with the invoice\n\nThe invoice freezes the amount, currency, methods and both shares. Changing store preferences does not modify issued links. Sliders calculate the allocation; live execution depends on the connected channel’s capabilities.\n\nFor a new live card or Alipay payment, the current gateway supports only feeCustomerPercent=0 and vatCustomerPercent=100: the merchant covers the entire processing fee and VAT is added in full for the customer. Other shares can be saved and calculated on an invoice, but execution is blocked with unsupported_allocation. The server never silently changes saved terms. SBP and USDT crypto payments support every processing-fee share and have no VAT.",
      "readMinutes": 6
    },
    {
      "id": "widgets",
      "title": "Embed checkout on your website",
      "summary": "Open checkout in a modal, embed it in a page or send the customer to a dedicated payment page. The widget uses a public checkout URL and never needs a merchant API key in the browser.",
      "tags": [
        "widget",
        "iframe",
        "embed",
        "HTML",
        "integration",
        "modal",
        "checkout"
      ],
      "sections": [
        {
          "id": "flow",
          "title": "From invoice to checkout",
          "paragraphs": [
            "Create an invoice in /account#links and immediately receive checkoutUrl. Open /account#widget, paste the link and choose a modal, inline block or redirect. Keys and webhooks are available in neighbouring account sections.",
            "The builder preview always uses a demo order without charging. The generated widget code retains your live link, whose terms come from the saved server invoice.",
            "For a new invoice in the interface, USD offers cards and Alipay; RUB offers SBP; USDT offers crypto. The API can also save USD + crypto for compatibility, but its live crypto payment is blocked with crypto_requires_usdt. USD and USDT are distinct, with no automatic conversion or assumed 1:1 rate. A crypto payment requires a separate USDT invoice."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Integration builder",
              "href": "/account#widget"
            },
            {
              "label": "Payment links API",
              "href": "/docs/payment-links-api"
            }
          ]
        },
        {
          "id": "markup",
          "title": "A button with a normal link fallback",
          "paragraphs": [
            "This example opens a demo without charging money. Replace both URL values with checkoutUrl from your invoice response. Load the script from the same Kevmi origin as the checkout URL.",
            "The href opens checkout when JavaScript is unavailable. data-kevmi-label gives the iframe an accessible name. Include the script once per page."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": {
            "language": "HTML",
            "code": "<script src=\"https://kevmi.maxeevmax1.chatgpt.site/widgets/kevmi.js\" defer></script>\n<a href=\"https://kevmi.maxeevmax1.chatgpt.site/en/pay/demo\"\n   data-kevmi-checkout=\"https://kevmi.maxeevmax1.chatgpt.site/en/pay/demo\"\n   data-kevmi-mode=\"modal\"\n   data-kevmi-label=\"Order checkout\">Pay securely</a>"
          },
          "note": "",
          "links": []
        },
        {
          "id": "modes",
          "title": "Three ways to open checkout",
          "paragraphs": [
            "Use a container such as div for inline mode and replace CHECKOUT_URL_FROM_API with a real URL. The frame adapts to its container width; checkout messages can resize its height within a bounded range.",
            "The modal closes with its button, Escape or a backdrop click. Focus returns to the original trigger after closing. Reduced-motion settings shorten the transition."
          ],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "data-kevmi-mode",
              "Behavior",
              "Useful for"
            ],
            "rows": [
              [
                "modal",
                "An overlay dialog; the default mode",
                "An order-level payment button"
              ],
              [
                "inline",
                "An iframe inside the selected container",
                "A checkout step on your site"
              ],
              [
                "redirect",
                "Navigation to Kevmi in the current tab",
                "A full payment page"
              ]
            ]
          },
          "code": {
            "language": "HTML",
            "code": "<div data-kevmi-checkout=\"CHECKOUT_URL_FROM_API\"\n     data-kevmi-mode=\"inline\"\n     data-kevmi-label=\"Order checkout\"></div>"
          },
          "note": "",
          "links": []
        },
        {
          "id": "javascript",
          "title": "Open checkout from your interface",
          "paragraphs": [
            "The kevmi:opened and kevmi:closed document events let your interface react to opening and closing. A kevmi:error event on the trigger reports an invalid checkout URL. None proves payment. Call the JavaScript API after the widget script has loaded."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": {
            "language": "JavaScript",
            "code": "window.Kevmi.open(checkoutUrl, {\n  mode: 'modal',\n  label: 'Order checkout',\n  closeLabel: 'Close checkout'\n});\n\n// Inline blocks added after page load are detected automatically.\n// You may also request mounting explicitly:\nwindow.Kevmi.mount(document);"
          },
          "note": "",
          "links": []
        },
        {
          "id": "security",
          "title": "What proves a successful payment",
          "paragraphs": [
            "Do not put API keys or signing secrets in HTML. The widget receives only a public link to one invoice. Checkout encrypts card details and bank codes with the gateway key; the Kevmi server does not accept them in plaintext.",
            "postMessage updates interface state, not order fulfilment. Check the message origin and source window before processing. Use a verified payment.succeeded event or a succeeded status in the server’s GET link.payment summary for the final result."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "Opening checkout, closing a widget or returning to the merchant site does not prove that money was received.",
          "links": [
            {
              "label": "Webhook signatures and delivery",
              "href": "/docs/webhooks"
            }
          ]
        },
        {
          "id": "deployment",
          "title": "Before adding the widget to production",
          "paragraphs": [],
          "bullets": [
            "Allow the Kevmi origin in your Content Security Policy script-src and frame-src directives without broadening unrelated policies.",
            "Check narrow screens, keyboard access, and light and dark themes.",
            "Confirm the invoice is active, unexpired and has the correct price and cost shares.",
            "Keep an ordinary payment link as a fallback.",
            "Test failed deliveries and duplicate webhook events without issuing an order twice."
          ],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        }
      ],
      "group": "developers",
      "url": "/docs/widgets",
      "body": "Open checkout in a modal, embed it in a page or send the customer to a dedicated payment page. The widget uses a public checkout URL and never needs a merchant API key in the browser.\n\nFrom invoice to checkout\n\nCreate an invoice in /account#links and immediately receive checkoutUrl. Open /account#widget, paste the link and choose a modal, inline block or redirect. Keys and webhooks are available in neighbouring account sections.\n\nThe builder preview always uses a demo order without charging. The generated widget code retains your live link, whose terms come from the saved server invoice.\n\nFor a new invoice in the interface, USD offers cards and Alipay; RUB offers SBP; USDT offers crypto. The API can also save USD + crypto for compatibility, but its live crypto payment is blocked with crypto_requires_usdt. USD and USDT are distinct, with no automatic conversion or assumed 1:1 rate. A crypto payment requires a separate USDT invoice.\n\nIntegration builder: https://kevmi.one/en/account#widget\n\nPayment links API: https://kevmi.one/en/docs/payment-links-api\n\nA button with a normal link fallback\n\nThis example opens a demo without charging money. Replace both URL values with checkoutUrl from your invoice response. Load the script from the same Kevmi origin as the checkout URL.\n\nThe href opens checkout when JavaScript is unavailable. data-kevmi-label gives the iframe an accessible name. Include the script once per page.\n\n<script src=\"https://kevmi.maxeevmax1.chatgpt.site/widgets/kevmi.js\" defer></script>\n<a href=\"https://kevmi.maxeevmax1.chatgpt.site/en/pay/demo\"\n   data-kevmi-checkout=\"https://kevmi.maxeevmax1.chatgpt.site/en/pay/demo\"\n   data-kevmi-mode=\"modal\"\n   data-kevmi-label=\"Order checkout\">Pay securely</a>\n\nThree ways to open checkout\n\nUse a container such as div for inline mode and replace CHECKOUT_URL_FROM_API with a real URL. The frame adapts to its container width; checkout messages can resize its height within a bounded range.\n\nThe modal closes with its button, Escape or a backdrop click. Focus returns to the original trigger after closing. Reduced-motion settings shorten the transition.\n\ndata-kevmi-mode · Behavior · Useful for\nmodal · An overlay dialog; the default mode · An order-level payment button\ninline · An iframe inside the selected container · A checkout step on your site\nredirect · Navigation to Kevmi in the current tab · A full payment page\n\n<div data-kevmi-checkout=\"CHECKOUT_URL_FROM_API\"\n     data-kevmi-mode=\"inline\"\n     data-kevmi-label=\"Order checkout\"></div>\n\nOpen checkout from your interface\n\nThe kevmi:opened and kevmi:closed document events let your interface react to opening and closing. A kevmi:error event on the trigger reports an invalid checkout URL. None proves payment. Call the JavaScript API after the widget script has loaded.\n\nwindow.Kevmi.open(checkoutUrl, {\n  mode: 'modal',\n  label: 'Order checkout',\n  closeLabel: 'Close checkout'\n});\n\n// Inline blocks added after page load are detected automatically.\n// You may also request mounting explicitly:\nwindow.Kevmi.mount(document);\n\nWhat proves a successful payment\n\nDo not put API keys or signing secrets in HTML. The widget receives only a public link to one invoice. Checkout encrypts card details and bank codes with the gateway key; the Kevmi server does not accept them in plaintext.\n\npostMessage updates interface state, not order fulfilment. Check the message origin and source window before processing. Use a verified payment.succeeded event or a succeeded status in the server’s GET link.payment summary for the final result.\n\nOpening checkout, closing a widget or returning to the merchant site does not prove that money was received.\n\nWebhook signatures and delivery: https://kevmi.one/en/docs/webhooks\n\nBefore adding the widget to production\n\nAllow the Kevmi origin in your Content Security Policy script-src and frame-src directives without broadening unrelated policies.\n\nCheck narrow screens, keyboard access, and light and dark themes.\n\nConfirm the invoice is active, unexpired and has the correct price and cost shares.\n\nKeep an ordinary payment link as a fallback.\n\nTest failed deliveries and duplicate webhook events without issuing an order twice.",
      "readMinutes": 4
    },
    {
      "id": "applications",
      "title": "Apply to connect your store",
      "summary": "Submit your website after signing in with Telegram and follow each review stage at a private URL. Automated checks support the reviewer; a moderator always makes the final decision.",
      "tags": [
        "application",
        "onboarding",
        "moderation",
        "website review",
        "status",
        "Telegram",
        "AI"
      ],
      "sections": [
        {
          "id": "submit",
          "title": "Submit an application",
          "paragraphs": [
            "Descriptions require 40–3000 characters; project names allow up to 100. The website must be accessible without signing in. URLs containing credentials, private hosts, nonstandard ports or query parameters are not accepted.",
            "The verified account owns the application. The entered Telegram contact is for communication and does not change ownership. Forwarding the tracking URL does not grant another account access."
          ],
          "bullets": [],
          "steps": [
            "Sign in or register with Telegram, then open /account#applications.",
            "Enter a public HTTPS website address, project name, category and a description of your products or services.",
            "Add a Telegram contact. Explain what customers receive and how orders are fulfilled.",
            "Confirm your authority to submit the site and send the form.",
            "Keep the /account#applications/{id} address that opens immediately after submission."
          ],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Submit your website",
              "href": "/account#applications"
            }
          ]
        },
        {
          "id": "stages",
          "title": "Four review stages",
          "paragraphs": [
            "The connecting line and stage markers reflect persisted server states. Reopening the page continues the same process. Closing the tab does not cancel your application; background jobs continue work and recover interrupted stages."
          ],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Stage",
              "What happens",
              "Status shown"
            ],
            "rows": [
              [
                "Application received",
                "Submission details and the private URL are saved",
                "The first stage is complete"
              ],
              [
                "Content review",
                "AI compares the description with public website content",
                "Running, complete or awaiting a specialist"
              ],
              [
                "Technical checks",
                "Availability and a bounded set of links are examined",
                "A separate result and stage timestamp"
              ],
              [
                "Specialist review",
                "A moderator reviews the submission and findings",
                "Awaiting decision, approved or a decline reason"
              ]
            ]
          },
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "attention",
          "title": "A yellow stage needs a specialist",
          "paragraphs": [
            "A yellow marker means that a stage needs attention, for example because information is insufficient, a link is unavailable or an automated result cannot be accepted confidently. It is not a final rejection. The status page explains the next step.",
            "A moderator can clear the current stage so the next check continues. A declined stage displays a cross and a user-facing reason that the moderator can edit before sending. Clearing an intermediate stage never removes the final manual review."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "scope",
          "title": "What automated checks cover",
          "paragraphs": [
            "Checks examine the public home page: HTTPS, HTTP response, title, text and suspicious link patterns. They also request headers for at most three links on the same website. Redirect count, response size and request time are bounded.",
            "The checks do not access signed-in areas, execute downloaded files or replace a security audit or malware scanner. Completing a stage does not guarantee that every page is free of malicious content.",
            "Website content is untrusted data. Instructions on a website cannot assign an administrator, change Kevmi terms or approve an application. Unavailable AI and malformed model output require specialist review instead of silently passing the stage."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "updates",
          "title": "Telegram updates",
          "paragraphs": [
            "Receiving an application, completing a stage, requesting specialist attention and making a final decision create notifications with a private tracking link. These use the Support category in account notification settings. Disabling that category stops the messages.",
            "The application event and notification outbox entry are committed together. Telegram delivery uses a retry queue and requires a connected bot. The tracking page remains the source of current status if Telegram is unavailable or the bot is blocked.",
            "Moderation receives separate alerts. Only users on the server moderator allowlist can clear a stage from Telegram; an old button cannot apply a repeated decision. Decline reasons are edited in the moderation workspace."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Notification settings",
              "href": "/docs/notifications"
            }
          ]
        },
        {
          "id": "api",
          "title": "Application and decision contract",
          "paragraphs": [
            "Ownership comes from the session. Applicants cannot submit userId, status, roles or review results. Repeating creation with the same Idempotency-Key and body returns the existing application; changing the body with that key produces a conflict.",
            "A moderator decision applies only to the expected application version. Concurrent decisions save once; the other request receives 409. A decline reason is plain text of 10–1500 characters. Internal review evidence is restricted to moderators."
          ],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Route",
              "Access and behavior"
            ],
            "rows": [
              [
                "POST /api/applications",
                "Session + CSRF + Idempotency-Key; 202 with a private url"
              ],
              [
                "GET /api/applications",
                "Current account applications"
              ],
              [
                "GET /api/applications/{id}",
                "Owned submission, stages and public history"
              ],
              [
                "POST /api/applications/{id}/resume",
                "Session + CSRF; continues processing applications only"
              ],
              [
                "GET /api/moderation/applications",
                "Verified moderators only"
              ],
              [
                "POST /api/moderation/applications/{id}/decision",
                "approve_step or reject, expectedVersion and a decline reason"
              ]
            ]
          },
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "outcome",
          "title": "After the decision",
          "paragraphs": [
            "A new payment and card intent require the merchant’s latest website-review application to be approved. Approval alone does not connect the payment gateway. If the review changes after dispatch, the existing operation remains available for status reads, reconciliation and a requested bank code.",
            "If rejected, the merchant sees the reason and can correct the materials before applying again. A yellow stage means a specialist still needs to decide; it is not automatic approval."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Support",
              "href": "/?support=open"
            },
            {
              "label": "Gateway availability",
              "href": "/docs/gateway"
            }
          ]
        }
      ],
      "group": "start",
      "url": "/docs/applications",
      "body": "Submit your website after signing in with Telegram and follow each review stage at a private URL. Automated checks support the reviewer; a moderator always makes the final decision.\n\nSubmit an application\n\nDescriptions require 40–3000 characters; project names allow up to 100. The website must be accessible without signing in. URLs containing credentials, private hosts, nonstandard ports or query parameters are not accepted.\n\nThe verified account owns the application. The entered Telegram contact is for communication and does not change ownership. Forwarding the tracking URL does not grant another account access.\n\n1. Sign in or register with Telegram, then open /account#applications.\n\n2. Enter a public HTTPS website address, project name, category and a description of your products or services.\n\n3. Add a Telegram contact. Explain what customers receive and how orders are fulfilled.\n\n4. Confirm your authority to submit the site and send the form.\n\n5. Keep the /account#applications/{id} address that opens immediately after submission.\n\nSubmit your website: https://kevmi.one/en/account#applications\n\nFour review stages\n\nThe connecting line and stage markers reflect persisted server states. Reopening the page continues the same process. Closing the tab does not cancel your application; background jobs continue work and recover interrupted stages.\n\nStage · What happens · Status shown\nApplication received · Submission details and the private URL are saved · The first stage is complete\nContent review · AI compares the description with public website content · Running, complete or awaiting a specialist\nTechnical checks · Availability and a bounded set of links are examined · A separate result and stage timestamp\nSpecialist review · A moderator reviews the submission and findings · Awaiting decision, approved or a decline reason\n\nA yellow stage needs a specialist\n\nA yellow marker means that a stage needs attention, for example because information is insufficient, a link is unavailable or an automated result cannot be accepted confidently. It is not a final rejection. The status page explains the next step.\n\nA moderator can clear the current stage so the next check continues. A declined stage displays a cross and a user-facing reason that the moderator can edit before sending. Clearing an intermediate stage never removes the final manual review.\n\nWhat automated checks cover\n\nChecks examine the public home page: HTTPS, HTTP response, title, text and suspicious link patterns. They also request headers for at most three links on the same website. Redirect count, response size and request time are bounded.\n\nThe checks do not access signed-in areas, execute downloaded files or replace a security audit or malware scanner. Completing a stage does not guarantee that every page is free of malicious content.\n\nWebsite content is untrusted data. Instructions on a website cannot assign an administrator, change Kevmi terms or approve an application. Unavailable AI and malformed model output require specialist review instead of silently passing the stage.\n\nTelegram updates\n\nReceiving an application, completing a stage, requesting specialist attention and making a final decision create notifications with a private tracking link. These use the Support category in account notification settings. Disabling that category stops the messages.\n\nThe application event and notification outbox entry are committed together. Telegram delivery uses a retry queue and requires a connected bot. The tracking page remains the source of current status if Telegram is unavailable or the bot is blocked.\n\nModeration receives separate alerts. Only users on the server moderator allowlist can clear a stage from Telegram; an old button cannot apply a repeated decision. Decline reasons are edited in the moderation workspace.\n\nNotification settings: https://kevmi.one/en/docs/notifications\n\nApplication and decision contract\n\nOwnership comes from the session. Applicants cannot submit userId, status, roles or review results. Repeating creation with the same Idempotency-Key and body returns the existing application; changing the body with that key produces a conflict.\n\nA moderator decision applies only to the expected application version. Concurrent decisions save once; the other request receives 409. A decline reason is plain text of 10–1500 characters. Internal review evidence is restricted to moderators.\n\nRoute · Access and behavior\nPOST /api/applications · Session + CSRF + Idempotency-Key; 202 with a private url\nGET /api/applications · Current account applications\nGET /api/applications/{id} · Owned submission, stages and public history\nPOST /api/applications/{id}/resume · Session + CSRF; continues processing applications only\nGET /api/moderation/applications · Verified moderators only\nPOST /api/moderation/applications/{id}/decision · approve_step or reject, expectedVersion and a decline reason\n\nAfter the decision\n\nA new payment and card intent require the merchant’s latest website-review application to be approved. Approval alone does not connect the payment gateway. If the review changes after dispatch, the existing operation remains available for status reads, reconciliation and a requested bank code.\n\nIf rejected, the merchant sees the reason and can correct the materials before applying again. A yellow stage means a specialist still needs to decide; it is not automatic approval.\n\nSupport: https://kevmi.one/en?support=open\n\nGateway availability: https://kevmi.one/en/docs/gateway",
      "readMinutes": 6
    }
  ],
  "facts": {
    "paymentType": "one_time",
    "subscriptionsSupported": false,
    "incomingFees": {
      "card": {
        "percent": 10,
        "fixedUsdMinor": 50,
        "vatApplies": true
      },
      "alipay": {
        "percent": 10,
        "fixedUsdMinor": 50,
        "vatApplies": true
      },
      "sbp": {
        "percent": 8,
        "fixedUsdMinor": 0,
        "vatApplies": false
      },
      "crypto": {
        "percent": 4,
        "fixedUsdMinor": 0,
        "vatApplies": false
      }
    },
    "vat": {
      "ratePercent": 16,
      "base": "order_base_amount",
      "defaultPayer": "customer",
      "payerOptions": [
        "customer",
        "merchant",
        "shared"
      ],
      "customerPercentRange": [
        0,
        100
      ],
      "customerPercentStep": 1,
      "feeBase": "order_base_amount",
      "source": "owner_confirmed",
      "example": {
        "baseUsdMinor": 500,
        "feeUsdMinor": 100,
        "vatUsdMinor": 80,
        "customerPayer": {
          "chargedUsdMinor": 580,
          "merchantNetUsdMinor": 400
        },
        "merchantPayer": {
          "chargedUsdMinor": 500,
          "merchantNetUsdMinor": 320
        }
      }
    },
    "payout": {
      "asset": "USDT",
      "network": "TRC20",
      "sourceFees": {
        "card": "4%",
        "alipay": "4%",
        "sbp": "5% + RUB 400",
        "crypto": "0% + $3"
      },
      "creationImplemented": false,
      "gatewayBalanceIsMerchantLedger": false,
      "fixedCryptoFeeCurrency": "USD"
    },
    "costSharing": {
      "pricingVersion": 2,
      "independent": [
        "vatCustomerPercent",
        "feeCustomerPercent"
      ],
      "range": [
        0,
        100
      ],
      "step": 1,
      "defaultVatCustomerPercent": 100,
      "defaultFeeCustomerPercent": 0,
      "customerSharesAddedToCharge": true,
      "merchantSharesDeductedFromBase": true,
      "rounding": "half_up_customer_share_then_exact_merchant_remainder",
      "invoiceTermsImmutable": true,
      "liveGatewayAllocation": {
        "card": {
          "vatCustomerPercent": 100,
          "feeCustomerPercent": 0
        },
        "alipay": {
          "vatCustomerPercent": 100,
          "feeCustomerPercent": 0
        },
        "sbp": {
          "feeCustomerPercent": [
            0,
            100
          ],
          "vatApplies": false
        },
        "crypto": {
          "feeCustomerPercent": [
            0,
            100
          ],
          "vatApplies": false
        },
        "otherSavedCardSplitsExecutable": false
      },
      "example": {
        "baseUsdMinor": 500,
        "vatCustomerPercent": 50,
        "feeCustomerPercent": 23,
        "customerVatMinor": 40,
        "customerFeeMinor": 23,
        "customerTotalMinor": 563,
        "merchantNetMinor": 383
      }
    },
    "paymentLinks": {
      "methodSelection": "customer_from_invoice_methods",
      "interfaceAnyMode": "all_methods_for_invoice_currency",
      "allowedMethodsByCurrency": {
        "USD": [
          "card",
          "alipay"
        ],
        "RUB": [
          "sbp"
        ],
        "USDT": [
          "crypto"
        ]
      },
      "apiCreateField": "methods",
      "legacyUsdCryptoApiSaveAccepted": true,
      "legacyUsdCryptoExecutable": false,
      "cryptoRequiresExplicitUsdt": true,
      "ownerGetPaymentField": "payment",
      "ownerGetPaymentNullable": true,
      "createAndPatchPaymentSummaryOptional": true,
      "apiAnyValueSupported": false,
      "quotesPerMethod": true,
      "automaticCurrencyConversion": false
    },
    "merchantAPI": {
      "basePath": "/api/v1",
      "createInvoicePath": "/api/v1/payments",
      "createsCharge": false,
      "returnsCheckoutUrl": true,
      "scopes": [
        "invoices:read",
        "invoices:write",
        "events:read"
      ],
      "defaultKeyLifetimeDays": 90,
      "maximumActiveKeys": 10,
      "keysStoredAsHashes": true
    },
    "widgets": {
      "script": "/widgets/kevmi.js",
      "modes": [
        "modal",
        "inline",
        "redirect"
      ],
      "publicCheckoutUrlOnly": true,
      "browserMessagesConfirmPayment": false
    },
    "webhooks": {
      "events": [
        "invoice.created",
        "invoice.updated",
        "payment.succeeded",
        "payment.failed",
        "payment.refunded",
        "payment.partially_refunded",
        "payment.disputed",
        "payment.review_required"
      ],
      "signatureHeader": "Kevmi-Signature",
      "signatureAlgorithm": "HMAC-SHA256",
      "signatureInput": "timestamp.rawBody",
      "timestampToleranceSeconds": 300,
      "delivery": "at_least_once",
      "maximumAttempts": 6,
      "retryDelaySeconds": [
        60,
        300,
        1800,
        7200,
        43200
      ],
      "endpointVerificationRequired": true,
      "paymentSource": "validated_gateway_receipt",
      "financialStatusFromBrowser": false
    },
    "applications": {
      "path": "/account#applications",
      "trackingPath": "/account#applications/{id}",
      "authentication": "telegram_session",
      "visibility": "owner_and_moderators",
      "stages": [
        "received",
        "ai_review",
        "technical_review",
        "manual_review"
      ],
      "manualFinalDecisionRequired": true,
      "businessTypes": [
        "digital_goods",
        "software",
        "services",
        "physical_goods",
        "education",
        "other"
      ],
      "submissionLimitPerDay": 5,
      "resumeLimitPerMinute": 30,
      "moderationLimitPerMinute": 30,
      "aiReviewsPerHour": 30,
      "unknownAutomatedResults": "needs_review",
      "checks": "bounded_public_content_and_same_origin_links",
      "safetyGuarantee": false,
      "notificationCategory": "support",
      "approvalActivatesGateway": false,
      "latestApprovalRequiredForNewPayment": true,
      "invoiceCreationBeforeApproval": true,
      "existingOperationReadableAfterApprovalChange": true
    },
    "countries": {
      "card": {
        "countryCount": 223,
        "ownerReportedCountryCount": null,
        "coverageLabel": "190+",
        "restrictions": [
          {
            "code": "AF",
            "name": "Afghanistan",
            "nameEn": "Afghanistan"
          },
          {
            "code": "AQ",
            "name": "Antarctica",
            "nameEn": "Antarctica"
          },
          {
            "code": "BY",
            "name": "Belarus",
            "nameEn": "Belarus"
          },
          {
            "code": "MM",
            "name": "Burma (Myanmar)",
            "nameEn": "Burma (Myanmar)"
          },
          {
            "code": "BI",
            "name": "Burundi",
            "nameEn": "Burundi"
          },
          {
            "code": "CF",
            "name": "Central African Republic",
            "nameEn": "Central African Republic"
          },
          {
            "code": "TD",
            "name": "Chad",
            "nameEn": "Chad"
          },
          {
            "code": "CU",
            "name": "Cuba",
            "nameEn": "Cuba"
          },
          {
            "code": "CD",
            "name": "Democratic Republic of Congo",
            "nameEn": "Democratic Republic of Congo"
          },
          {
            "code": "CG",
            "name": "Republic of Congo",
            "nameEn": "Republic of Congo"
          },
          {
            "code": "ER",
            "name": "Eritrea",
            "nameEn": "Eritrea"
          },
          {
            "code": "HT",
            "name": "Haiti",
            "nameEn": "Haiti"
          },
          {
            "code": "IR",
            "name": "Iran",
            "nameEn": "Iran"
          },
          {
            "code": "IQ",
            "name": "Iraq",
            "nameEn": "Iraq"
          },
          {
            "code": "LY",
            "name": "Libya",
            "nameEn": "Libya"
          },
          {
            "code": "ML",
            "name": "Mali",
            "nameEn": "Mali"
          },
          {
            "code": "NI",
            "name": "Nicaragua",
            "nameEn": "Nicaragua"
          },
          {
            "code": "KP",
            "name": "North Korea",
            "nameEn": "North Korea"
          },
          {
            "code": "RU",
            "name": "Russia",
            "nameEn": "Russia"
          },
          {
            "code": "SO",
            "name": "Somalia",
            "nameEn": "Somalia"
          },
          {
            "code": "SS",
            "name": "South Sudan",
            "nameEn": "South Sudan"
          },
          {
            "code": "SD",
            "name": "Sudan",
            "nameEn": "Sudan"
          },
          {
            "code": "SY",
            "name": "Syria",
            "nameEn": "Syria"
          },
          {
            "code": "VE",
            "name": "Venezuela",
            "nameEn": "Venezuela"
          },
          {
            "code": "YE",
            "name": "Yemen",
            "nameEn": "Yemen"
          },
          {
            "code": "ZW",
            "name": "Zimbabwe",
            "nameEn": "Zimbabwe"
          },
          {
            "code": "UA-43",
            "countryCode": "UA",
            "name": "Crimea (Region of Ukraine)",
            "nameEn": "Crimea (Region of Ukraine)"
          },
          {
            "code": "UA-14",
            "countryCode": "UA",
            "name": "Donetsk (Region of Ukraine)",
            "nameEn": "Donetsk (Region of Ukraine)"
          },
          {
            "code": "UA-65",
            "countryCode": "UA",
            "name": "Kherson (Region of Ukraine)",
            "nameEn": "Kherson (Region of Ukraine)"
          },
          {
            "code": "UA-09",
            "countryCode": "UA",
            "name": "Luhansk (Region of Ukraine)",
            "nameEn": "Luhansk (Region of Ukraine)"
          },
          {
            "code": "UA-23",
            "countryCode": "UA",
            "name": "Zaporizhzhia (Region of Ukraine)",
            "nameEn": "Zaporizhzhia (Region of Ukraine)"
          },
          {
            "code": "AN",
            "name": "Netherlands Antilles",
            "nameEn": "Netherlands Antilles"
          }
        ],
        "verifiedCountryCount": null,
        "exactList": [
          "AX",
          "AL",
          "DZ",
          "AS",
          "AD",
          "AO",
          "AI",
          "AG",
          "AR",
          "AM",
          "AW",
          "AU",
          "AT",
          "AZ",
          "BS",
          "BH",
          "BD",
          "BB",
          "BE",
          "BZ",
          "BJ",
          "BM",
          "BT",
          "BO",
          "BQ",
          "BA",
          "BW",
          "BV",
          "BR",
          "IO",
          "BN",
          "BG",
          "BF",
          "CV",
          "KH",
          "CM",
          "CA",
          "KY",
          "CL",
          "CN",
          "CX",
          "CC",
          "CO",
          "KM",
          "CK",
          "CR",
          "HR",
          "CW",
          "CY",
          "CZ",
          "CI",
          "DK",
          "DJ",
          "DM",
          "DO",
          "EC",
          "EG",
          "SV",
          "GQ",
          "EE",
          "SZ",
          "ET",
          "FK",
          "FO",
          "FM",
          "FJ",
          "FI",
          "FR",
          "GF",
          "PF",
          "TF",
          "GA",
          "GM",
          "GE",
          "DE",
          "GH",
          "GI",
          "GR",
          "GL",
          "GD",
          "GP",
          "GU",
          "GT",
          "GG",
          "GN",
          "GW",
          "GY",
          "HM",
          "VA",
          "HN",
          "HK",
          "HU",
          "IS",
          "IN",
          "ID",
          "IE",
          "IM",
          "IL",
          "IT",
          "JM",
          "JP",
          "JE",
          "JO",
          "KZ",
          "KE",
          "KI",
          "KW",
          "KG",
          "LA",
          "LV",
          "LB",
          "LS",
          "LR",
          "LI",
          "LT",
          "LU",
          "MO",
          "MG",
          "MW",
          "MY",
          "MV",
          "MT",
          "MH",
          "MQ",
          "MR",
          "MU",
          "YT",
          "MX",
          "MD",
          "MC",
          "MN",
          "ME",
          "MS",
          "MA",
          "MZ",
          "NA",
          "NR",
          "NP",
          "NL",
          "NC",
          "NZ",
          "NE",
          "NG",
          "NU",
          "NF",
          "MK",
          "MP",
          "NO",
          "OM",
          "PK",
          "PW",
          "PA",
          "PG",
          "PY",
          "PE",
          "PH",
          "PN",
          "PL",
          "PT",
          "PR",
          "QA",
          "RO",
          "RW",
          "RE",
          "BL",
          "SH",
          "KN",
          "LC",
          "MF",
          "PM",
          "VC",
          "WS",
          "SM",
          "ST",
          "SA",
          "SN",
          "RS",
          "SC",
          "SL",
          "SG",
          "SX",
          "SK",
          "SI",
          "SB",
          "ZA",
          "GS",
          "KR",
          "ES",
          "LK",
          "PS",
          "SR",
          "SJ",
          "SE",
          "CH",
          "TW",
          "TJ",
          "TZ",
          "TH",
          "TL",
          "TG",
          "TK",
          "TO",
          "TT",
          "TN",
          "TM",
          "TC",
          "TV",
          "TR",
          "UG",
          "UA",
          "AE",
          "GB",
          "UM",
          "US",
          "UY",
          "UZ",
          "VU",
          "VN",
          "VG",
          "VI",
          "WF",
          "EH",
          "ZM"
        ],
        "records": [
          {
            "code": "AX",
            "name": "Åland Islands",
            "nameEn": "Åland Islands",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "AL",
            "name": "Albania",
            "nameEn": "Albania",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "DZ",
            "name": "Algeria",
            "nameEn": "Algeria",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "AS",
            "name": "American Samoa",
            "nameEn": "American Samoa",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "AD",
            "name": "Andorra",
            "nameEn": "Andorra",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "AO",
            "name": "Angola",
            "nameEn": "Angola",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "AI",
            "name": "Anguilla",
            "nameEn": "Anguilla",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "AG",
            "name": "Antigua & Barbuda",
            "nameEn": "Antigua & Barbuda",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "AR",
            "name": "Argentina",
            "nameEn": "Argentina",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "AM",
            "name": "Armenia",
            "nameEn": "Armenia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "AW",
            "name": "Aruba",
            "nameEn": "Aruba",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "AU",
            "name": "Australia",
            "nameEn": "Australia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "AT",
            "name": "Austria",
            "nameEn": "Austria",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "AZ",
            "name": "Azerbaijan",
            "nameEn": "Azerbaijan",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "BS",
            "name": "Bahamas",
            "nameEn": "Bahamas",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "BH",
            "name": "Bahrain",
            "nameEn": "Bahrain",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "BD",
            "name": "Bangladesh",
            "nameEn": "Bangladesh",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "BB",
            "name": "Barbados",
            "nameEn": "Barbados",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "BE",
            "name": "Belgium",
            "nameEn": "Belgium",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "BZ",
            "name": "Belize",
            "nameEn": "Belize",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "BJ",
            "name": "Benin",
            "nameEn": "Benin",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "BM",
            "name": "Bermuda",
            "nameEn": "Bermuda",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "BT",
            "name": "Bhutan",
            "nameEn": "Bhutan",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "BO",
            "name": "Bolivia",
            "nameEn": "Bolivia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "BQ",
            "name": "Caribbean Netherlands",
            "nameEn": "Caribbean Netherlands",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "BA",
            "name": "Bosnia & Herzegovina",
            "nameEn": "Bosnia & Herzegovina",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "BW",
            "name": "Botswana",
            "nameEn": "Botswana",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "BV",
            "name": "Bouvet Island",
            "nameEn": "Bouvet Island",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "BR",
            "name": "Brazil",
            "nameEn": "Brazil",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "IO",
            "name": "British Indian Ocean Territory",
            "nameEn": "British Indian Ocean Territory",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "BN",
            "name": "Brunei",
            "nameEn": "Brunei",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "BG",
            "name": "Bulgaria",
            "nameEn": "Bulgaria",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "BF",
            "name": "Burkina Faso",
            "nameEn": "Burkina Faso",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "CV",
            "name": "Cape Verde",
            "nameEn": "Cape Verde",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "KH",
            "name": "Cambodia",
            "nameEn": "Cambodia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "CM",
            "name": "Cameroon",
            "nameEn": "Cameroon",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "CA",
            "name": "Canada",
            "nameEn": "Canada",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "KY",
            "name": "Cayman Islands",
            "nameEn": "Cayman Islands",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "CL",
            "name": "Chile",
            "nameEn": "Chile",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "CN",
            "name": "China",
            "nameEn": "China",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "CX",
            "name": "Christmas Island",
            "nameEn": "Christmas Island",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "CC",
            "name": "Cocos (Keeling) Islands",
            "nameEn": "Cocos (Keeling) Islands",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "CO",
            "name": "Colombia",
            "nameEn": "Colombia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "KM",
            "name": "Comoros",
            "nameEn": "Comoros",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "CK",
            "name": "Cook Islands",
            "nameEn": "Cook Islands",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "CR",
            "name": "Costa Rica",
            "nameEn": "Costa Rica",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "HR",
            "name": "Croatia",
            "nameEn": "Croatia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "CW",
            "name": "Curaçao",
            "nameEn": "Curaçao",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "CY",
            "name": "Cyprus",
            "nameEn": "Cyprus",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "CZ",
            "name": "Czechia",
            "nameEn": "Czechia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "CI",
            "name": "Côte d’Ivoire",
            "nameEn": "Côte d’Ivoire",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "DK",
            "name": "Denmark",
            "nameEn": "Denmark",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "DJ",
            "name": "Djibouti",
            "nameEn": "Djibouti",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "DM",
            "name": "Dominica",
            "nameEn": "Dominica",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "DO",
            "name": "Dominican Republic",
            "nameEn": "Dominican Republic",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "EC",
            "name": "Ecuador",
            "nameEn": "Ecuador",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "EG",
            "name": "Egypt",
            "nameEn": "Egypt",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "SV",
            "name": "El Salvador",
            "nameEn": "El Salvador",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "GQ",
            "name": "Equatorial Guinea",
            "nameEn": "Equatorial Guinea",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "EE",
            "name": "Estonia",
            "nameEn": "Estonia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "SZ",
            "name": "Eswatini",
            "nameEn": "Eswatini",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "ET",
            "name": "Ethiopia",
            "nameEn": "Ethiopia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "FK",
            "name": "Falkland Islands",
            "nameEn": "Falkland Islands",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "FO",
            "name": "Faroe Islands",
            "nameEn": "Faroe Islands",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "FM",
            "name": "Micronesia",
            "nameEn": "Micronesia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "FJ",
            "name": "Fiji",
            "nameEn": "Fiji",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "FI",
            "name": "Finland",
            "nameEn": "Finland",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "FR",
            "name": "France",
            "nameEn": "France",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "GF",
            "name": "French Guiana",
            "nameEn": "French Guiana",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "PF",
            "name": "French Polynesia",
            "nameEn": "French Polynesia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "TF",
            "name": "French Southern Territories",
            "nameEn": "French Southern Territories",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "GA",
            "name": "Gabon",
            "nameEn": "Gabon",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "GM",
            "name": "Gambia",
            "nameEn": "Gambia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "GE",
            "name": "Georgia",
            "nameEn": "Georgia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "DE",
            "name": "Germany",
            "nameEn": "Germany",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "GH",
            "name": "Ghana",
            "nameEn": "Ghana",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "GI",
            "name": "Gibraltar",
            "nameEn": "Gibraltar",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "GR",
            "name": "Greece",
            "nameEn": "Greece",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "GL",
            "name": "Greenland",
            "nameEn": "Greenland",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "GD",
            "name": "Grenada",
            "nameEn": "Grenada",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "GP",
            "name": "Guadeloupe",
            "nameEn": "Guadeloupe",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "GU",
            "name": "Guam",
            "nameEn": "Guam",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "GT",
            "name": "Guatemala",
            "nameEn": "Guatemala",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "GG",
            "name": "Guernsey",
            "nameEn": "Guernsey",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "GN",
            "name": "Guinea",
            "nameEn": "Guinea",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "GW",
            "name": "Guinea-Bissau",
            "nameEn": "Guinea-Bissau",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "GY",
            "name": "Guyana",
            "nameEn": "Guyana",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "HM",
            "name": "Heard & McDonald Islands",
            "nameEn": "Heard & McDonald Islands",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "VA",
            "name": "Vatican City",
            "nameEn": "Vatican City",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "HN",
            "name": "Honduras",
            "nameEn": "Honduras",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "HK",
            "name": "Hong Kong SAR China",
            "nameEn": "Hong Kong SAR China",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "HU",
            "name": "Hungary",
            "nameEn": "Hungary",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "IS",
            "name": "Iceland",
            "nameEn": "Iceland",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "IN",
            "name": "India",
            "nameEn": "India",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "ID",
            "name": "Indonesia",
            "nameEn": "Indonesia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "IE",
            "name": "Ireland",
            "nameEn": "Ireland",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "IM",
            "name": "Isle of Man",
            "nameEn": "Isle of Man",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "IL",
            "name": "Israel",
            "nameEn": "Israel",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "IT",
            "name": "Italy",
            "nameEn": "Italy",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "JM",
            "name": "Jamaica",
            "nameEn": "Jamaica",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "JP",
            "name": "Japan",
            "nameEn": "Japan",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "JE",
            "name": "Jersey",
            "nameEn": "Jersey",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "JO",
            "name": "Jordan",
            "nameEn": "Jordan",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "KZ",
            "name": "Kazakhstan",
            "nameEn": "Kazakhstan",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "KE",
            "name": "Kenya",
            "nameEn": "Kenya",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "KI",
            "name": "Kiribati",
            "nameEn": "Kiribati",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "KW",
            "name": "Kuwait",
            "nameEn": "Kuwait",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "KG",
            "name": "Kyrgyzstan",
            "nameEn": "Kyrgyzstan",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "LA",
            "name": "Laos",
            "nameEn": "Laos",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "LV",
            "name": "Latvia",
            "nameEn": "Latvia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "LB",
            "name": "Lebanon",
            "nameEn": "Lebanon",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "LS",
            "name": "Lesotho",
            "nameEn": "Lesotho",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "LR",
            "name": "Liberia",
            "nameEn": "Liberia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "LI",
            "name": "Liechtenstein",
            "nameEn": "Liechtenstein",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "LT",
            "name": "Lithuania",
            "nameEn": "Lithuania",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "LU",
            "name": "Luxembourg",
            "nameEn": "Luxembourg",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "MO",
            "name": "Macao SAR China",
            "nameEn": "Macao SAR China",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "MG",
            "name": "Madagascar",
            "nameEn": "Madagascar",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "MW",
            "name": "Malawi",
            "nameEn": "Malawi",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "MY",
            "name": "Malaysia",
            "nameEn": "Malaysia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "MV",
            "name": "Maldives",
            "nameEn": "Maldives",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "MT",
            "name": "Malta",
            "nameEn": "Malta",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "MH",
            "name": "Marshall Islands",
            "nameEn": "Marshall Islands",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "MQ",
            "name": "Martinique",
            "nameEn": "Martinique",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "MR",
            "name": "Mauritania",
            "nameEn": "Mauritania",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "MU",
            "name": "Mauritius",
            "nameEn": "Mauritius",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "YT",
            "name": "Mayotte",
            "nameEn": "Mayotte",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "MX",
            "name": "Mexico",
            "nameEn": "Mexico",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "MD",
            "name": "Moldova",
            "nameEn": "Moldova",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "MC",
            "name": "Monaco",
            "nameEn": "Monaco",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "MN",
            "name": "Mongolia",
            "nameEn": "Mongolia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "ME",
            "name": "Montenegro",
            "nameEn": "Montenegro",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "MS",
            "name": "Montserrat",
            "nameEn": "Montserrat",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "MA",
            "name": "Morocco",
            "nameEn": "Morocco",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "MZ",
            "name": "Mozambique",
            "nameEn": "Mozambique",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "NA",
            "name": "Namibia",
            "nameEn": "Namibia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "NR",
            "name": "Nauru",
            "nameEn": "Nauru",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "NP",
            "name": "Nepal",
            "nameEn": "Nepal",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "NL",
            "name": "Netherlands",
            "nameEn": "Netherlands",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "NC",
            "name": "New Caledonia",
            "nameEn": "New Caledonia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "NZ",
            "name": "New Zealand",
            "nameEn": "New Zealand",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "NE",
            "name": "Niger",
            "nameEn": "Niger",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "NG",
            "name": "Nigeria",
            "nameEn": "Nigeria",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "NU",
            "name": "Niue",
            "nameEn": "Niue",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "NF",
            "name": "Norfolk Island",
            "nameEn": "Norfolk Island",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "MK",
            "name": "North Macedonia",
            "nameEn": "North Macedonia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "MP",
            "name": "Northern Mariana Islands",
            "nameEn": "Northern Mariana Islands",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "NO",
            "name": "Norway",
            "nameEn": "Norway",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "OM",
            "name": "Oman",
            "nameEn": "Oman",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "PK",
            "name": "Pakistan",
            "nameEn": "Pakistan",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "PW",
            "name": "Palau",
            "nameEn": "Palau",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "PA",
            "name": "Panama",
            "nameEn": "Panama",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "PG",
            "name": "Papua New Guinea",
            "nameEn": "Papua New Guinea",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "PY",
            "name": "Paraguay",
            "nameEn": "Paraguay",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "PE",
            "name": "Peru",
            "nameEn": "Peru",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "PH",
            "name": "Philippines",
            "nameEn": "Philippines",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "PN",
            "name": "Pitcairn Islands",
            "nameEn": "Pitcairn Islands",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "PL",
            "name": "Poland",
            "nameEn": "Poland",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "PT",
            "name": "Portugal",
            "nameEn": "Portugal",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "PR",
            "name": "Puerto Rico",
            "nameEn": "Puerto Rico",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "QA",
            "name": "Qatar",
            "nameEn": "Qatar",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "RO",
            "name": "Romania",
            "nameEn": "Romania",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "RW",
            "name": "Rwanda",
            "nameEn": "Rwanda",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "RE",
            "name": "Réunion",
            "nameEn": "Réunion",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "BL",
            "name": "St. Barthélemy",
            "nameEn": "St. Barthélemy",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "SH",
            "name": "St. Helena",
            "nameEn": "St. Helena",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "KN",
            "name": "St. Kitts & Nevis",
            "nameEn": "St. Kitts & Nevis",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "LC",
            "name": "St. Lucia",
            "nameEn": "St. Lucia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "MF",
            "name": "St. Martin",
            "nameEn": "St. Martin",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "PM",
            "name": "St. Pierre & Miquelon",
            "nameEn": "St. Pierre & Miquelon",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "VC",
            "name": "St. Vincent & Grenadines",
            "nameEn": "St. Vincent & Grenadines",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "WS",
            "name": "Samoa",
            "nameEn": "Samoa",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "SM",
            "name": "San Marino",
            "nameEn": "San Marino",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "ST",
            "name": "São Tomé & Príncipe",
            "nameEn": "São Tomé & Príncipe",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "SA",
            "name": "Saudi Arabia",
            "nameEn": "Saudi Arabia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "SN",
            "name": "Senegal",
            "nameEn": "Senegal",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "RS",
            "name": "Serbia",
            "nameEn": "Serbia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "SC",
            "name": "Seychelles",
            "nameEn": "Seychelles",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "SL",
            "name": "Sierra Leone",
            "nameEn": "Sierra Leone",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "SG",
            "name": "Singapore",
            "nameEn": "Singapore",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "SX",
            "name": "Sint Maarten",
            "nameEn": "Sint Maarten",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "SK",
            "name": "Slovakia",
            "nameEn": "Slovakia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "SI",
            "name": "Slovenia",
            "nameEn": "Slovenia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "SB",
            "name": "Solomon Islands",
            "nameEn": "Solomon Islands",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "ZA",
            "name": "South Africa",
            "nameEn": "South Africa",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "GS",
            "name": "South Georgia & South Sandwich Islands",
            "nameEn": "South Georgia & South Sandwich Islands",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "KR",
            "name": "South Korea",
            "nameEn": "South Korea",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "ES",
            "name": "Spain",
            "nameEn": "Spain",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "LK",
            "name": "Sri Lanka",
            "nameEn": "Sri Lanka",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "PS",
            "name": "Palestinian Territories",
            "nameEn": "Palestinian Territories",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "SR",
            "name": "Suriname",
            "nameEn": "Suriname",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "SJ",
            "name": "Svalbard & Jan Mayen",
            "nameEn": "Svalbard & Jan Mayen",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "SE",
            "name": "Sweden",
            "nameEn": "Sweden",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "CH",
            "name": "Switzerland",
            "nameEn": "Switzerland",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "TW",
            "name": "Taiwan",
            "nameEn": "Taiwan",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "TJ",
            "name": "Tajikistan",
            "nameEn": "Tajikistan",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "TZ",
            "name": "Tanzania",
            "nameEn": "Tanzania",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "TH",
            "name": "Thailand",
            "nameEn": "Thailand",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "TL",
            "name": "Timor-Leste",
            "nameEn": "Timor-Leste",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "TG",
            "name": "Togo",
            "nameEn": "Togo",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "TK",
            "name": "Tokelau",
            "nameEn": "Tokelau",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "TO",
            "name": "Tonga",
            "nameEn": "Tonga",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "TT",
            "name": "Trinidad & Tobago",
            "nameEn": "Trinidad & Tobago",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "TN",
            "name": "Tunisia",
            "nameEn": "Tunisia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "TM",
            "name": "Turkmenistan",
            "nameEn": "Turkmenistan",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "TC",
            "name": "Turks & Caicos Islands",
            "nameEn": "Turks & Caicos Islands",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "TV",
            "name": "Tuvalu",
            "nameEn": "Tuvalu",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "TR",
            "name": "Türkiye",
            "nameEn": "Türkiye",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "UG",
            "name": "Uganda",
            "nameEn": "Uganda",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "UA",
            "name": "Ukraine",
            "nameEn": "Ukraine",
            "marker": "**",
            "coverage": "partial_locations",
            "note": "Cards are unavailable in Crimea, Donetsk, Luhansk, Kherson and Zaporizhzhia. The rest of Ukraine is available."
          },
          {
            "code": "AE",
            "name": "United Arab Emirates",
            "nameEn": "United Arab Emirates",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "GB",
            "name": "United Kingdom",
            "nameEn": "United Kingdom",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "UM",
            "name": "U.S. Outlying Islands",
            "nameEn": "U.S. Outlying Islands",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "US",
            "name": "United States",
            "nameEn": "United States",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "UY",
            "name": "Uruguay",
            "nameEn": "Uruguay",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "UZ",
            "name": "Uzbekistan",
            "nameEn": "Uzbekistan",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "VU",
            "name": "Vanuatu",
            "nameEn": "Vanuatu",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "VN",
            "name": "Vietnam",
            "nameEn": "Vietnam",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "VG",
            "name": "British Virgin Islands",
            "nameEn": "British Virgin Islands",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "VI",
            "name": "U.S. Virgin Islands",
            "nameEn": "U.S. Virgin Islands",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "WF",
            "name": "Wallis & Futuna",
            "nameEn": "Wallis & Futuna",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "EH",
            "name": "Western Sahara",
            "nameEn": "Western Sahara",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "ZM",
            "name": "Zambia",
            "nameEn": "Zambia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          }
        ],
        "source": "owner_provided",
        "status": "owner_list_received",
        "policy": "worldwide_except_restrictions",
        "independentlyVerified": false,
        "partialCoverage": {
          "marker": "**",
          "countryCodes": [
            "UA"
          ],
          "note": "Cards are unavailable in Crimea, Donetsk, Luhansk, Kherson and Zaporizhzhia. The rest of Ukraine is available."
        },
        "unresolvedFootnotes": [],
        "approvalGuaranteed": false
      },
      "sbp": [
        "RU"
      ],
      "alipay": [
        "CN"
      ],
      "crypto": {
        "exactList": null,
        "status": "live_catalog_required",
        "invoiceCurrency": "USDT",
        "cataloguePath": "/api/checkout/{token}/crypto-services"
      }
    },
    "cryptoAcceptance": {
      "invoiceCurrency": "USDT",
      "coinCount": 16,
      "pairCount": 31,
      "pairs": [
        {
          "currency": "AVAX",
          "network": "avalanche",
          "networkLabel": "Avalanche C-Chain"
        },
        {
          "currency": "BCH",
          "network": "bch",
          "networkLabel": "Bitcoin Cash"
        },
        {
          "currency": "BNB",
          "network": "bsc",
          "networkLabel": "BNB Smart Chain"
        },
        {
          "currency": "BTC",
          "network": "btc",
          "networkLabel": "Bitcoin"
        },
        {
          "currency": "DAI",
          "network": "bsc",
          "networkLabel": "BNB Smart Chain"
        },
        {
          "currency": "DAI",
          "network": "eth",
          "networkLabel": "Ethereum"
        },
        {
          "currency": "DAI",
          "network": "polygon",
          "networkLabel": "Polygon PoS"
        },
        {
          "currency": "DASH",
          "network": "dash",
          "networkLabel": "Dash"
        },
        {
          "currency": "DOGE",
          "network": "doge",
          "networkLabel": "Dogecoin"
        },
        {
          "currency": "ETH",
          "network": "eth",
          "networkLabel": "Ethereum"
        },
        {
          "currency": "ETH",
          "network": "arbitrum",
          "networkLabel": "Arbitrum One"
        },
        {
          "currency": "ETH",
          "network": "bsc",
          "networkLabel": "BNB Smart Chain"
        },
        {
          "currency": "GRAM",
          "network": "ton",
          "networkLabel": "TON"
        },
        {
          "currency": "LTC",
          "network": "ltc",
          "networkLabel": "Litecoin"
        },
        {
          "currency": "POL",
          "network": "eth",
          "networkLabel": "Ethereum"
        },
        {
          "currency": "POL",
          "network": "polygon",
          "networkLabel": "Polygon PoS"
        },
        {
          "currency": "SHIB",
          "network": "eth",
          "networkLabel": "Ethereum"
        },
        {
          "currency": "TRX",
          "network": "tron",
          "networkLabel": "TRON"
        },
        {
          "currency": "USDC",
          "network": "arbitrum",
          "networkLabel": "Arbitrum One"
        },
        {
          "currency": "USDC",
          "network": "bsc",
          "networkLabel": "BNB Smart Chain"
        },
        {
          "currency": "USDC",
          "network": "polygon",
          "networkLabel": "Polygon PoS"
        },
        {
          "currency": "USDC",
          "network": "eth",
          "networkLabel": "Ethereum"
        },
        {
          "currency": "USDC",
          "network": "avalanche",
          "networkLabel": "Avalanche C-Chain"
        },
        {
          "currency": "USDT",
          "network": "tron",
          "networkLabel": "TRON"
        },
        {
          "currency": "USDT",
          "network": "avalanche",
          "networkLabel": "Avalanche C-Chain"
        },
        {
          "currency": "USDT",
          "network": "bsc",
          "networkLabel": "BNB Smart Chain"
        },
        {
          "currency": "USDT",
          "network": "ton",
          "networkLabel": "TON"
        },
        {
          "currency": "USDT",
          "network": "polygon",
          "networkLabel": "Polygon PoS"
        },
        {
          "currency": "USDT",
          "network": "arbitrum",
          "networkLabel": "Arbitrum One"
        },
        {
          "currency": "USDT",
          "network": "eth",
          "networkLabel": "Ethereum"
        },
        {
          "currency": "XMR",
          "network": "xmr",
          "networkLabel": "Monero"
        }
      ],
      "catalogueSource": "owner_provided",
      "liveAvailabilitySource": "/api/checkout/{token}/crypto-services",
      "referenceCatalogueConfirmsAvailability": false,
      "transferInstructionsSource": "created_gateway_operation",
      "invoiceFixesOtherCoinExchangeRate": false,
      "exactTransferAmountRequired": true,
      "merchantPayout": {
        "asset": "USDT",
        "network": "TRC20",
        "distinctFromAcceptanceNetworks": true,
        "creationImplemented": false
      }
    },
    "support": {
      "knowledgeScope": "all_published_articles_and_facts",
      "articleCount": 25,
      "historyMessagesPerRequest": 6,
      "historyStorage": "browser_local_storage",
      "historySync": "device_only",
      "separateConversations": true,
      "perConversationDrafts": true,
      "pageContext": "safe_section_label_only",
      "privateAccountAccess": false,
      "financialActions": false,
      "fallback": "documentation_search",
      "readinessEndpoint": "/api/config"
    },
    "notifications": {
      "pageSize": 30,
      "readStateStorage": "server",
      "readStateAffectsTelegramDelivery": false,
      "readEndpoint": "/api/notifications/read"
    },
    "gatewayIntegration": {
      "adapterImplemented": true,
      "contract": "v3",
      "liveConfigurationProvided": null,
      "requiredEnvironment": [
        "GATEWAY_API_KEY",
        "GATEWAY_WEBHOOK_SECRET"
      ],
      "connectionModes": {
        "externalHttps": {
          "originEnvironment": "GATEWAY_BASE_URL"
        },
        "selfHostedService": {
          "capability": "GATEWAY_SERVICE",
          "fixedDestination": true,
          "publicGatewayApi": false
        }
      },
      "availability": {
        "source": "runtime",
        "configurationEndpoint": "/api/config",
        "configurationField": "gateway.configured",
        "configurationIncludesHealthCheck": false,
        "checkoutEndpoint": "/api/checkout/{token}",
        "checkoutField": "invoice.availability",
        "checkoutCompatibilityAlias": "invoice.gatewayConnected",
        "checkoutIncludesProviderApproval": false
      },
      "cardTransport": "browser_JWE_to_gateway",
      "cardPlaintextAcceptedByKevmi": false,
      "hostedCardApi": false,
      "sealedAlgorithms": [
        "RSA-OAEP-256",
        "A256GCM"
      ],
      "ingress": {
        "path": "/api/gateway/webhook",
        "signatureHeader": "X-Gateway-Signature",
        "timestampHeader": "X-Gateway-Timestamp",
        "eventIdHeader": "X-Gateway-Event-Id",
        "signatureAlgorithm": "HMAC-SHA256",
        "signatureInput": "timestamp.rawBody",
        "timestampToleranceSeconds": 300,
        "authenticatedOperationReadRequired": true
      },
      "successRequires": [
        "fulfillment_ready",
        "provider_confirmed",
        "exact_paid_amount",
        "no_dispute",
        "crypto_settlement_evidence_if_crypto"
      ],
      "statusDoesNotCharge": true,
      "reconciliationDoesNotCharge": true,
      "oneDispatchedOperationPerInvoice": true,
      "ledgerNotImplemented": true
    },
    "merchantWorkspace": {
      "path": "/account",
      "sections": [
        "links",
        "applications",
        "keys",
        "webhooks",
        "widget",
        "events",
        "knowledge",
        "store",
        "notifications",
        "support"
      ]
    },
    "gatewayConnected": null,
    "limitsConfirmed": false,
    "scope": "Public product documentation only. No user records or secrets."
  },
  "locale": "en",
  "docGroups": [
    {
      "id": "start",
      "title": "Getting started",
      "description": "From your first visit to a configured store.",
      "icon": "bolt"
    },
    {
      "id": "payments",
      "title": "Payments and terms",
      "description": "Links, amounts, VAT, payment methods and payouts.",
      "icon": "card"
    },
    {
      "id": "account",
      "title": "Account and support",
      "description": "Telegram, notifications and help with your question.",
      "icon": "settings"
    },
    {
      "id": "developers",
      "title": "Developers",
      "description": "API, security, webhooks and gateway integration.",
      "icon": "book"
    }
  ],
  "navPages": [
    {
      "href": "/",
      "title": "Overview",
      "icon": "grid"
    },
    {
      "href": "/payment-methods",
      "title": "Payment methods",
      "icon": "card"
    },
    {
      "href": "/pricing",
      "title": "Pricing",
      "icon": "percent"
    },
    {
      "href": "/payment-links",
      "title": "Payment links",
      "icon": "link"
    },
    {
      "href": "/countries",
      "title": "Coverage",
      "icon": "globe"
    },
    {
      "href": "/docs",
      "title": "Documentation",
      "icon": "book"
    },
    {
      "href": "/?support=open",
      "title": "Support",
      "icon": "chat"
    },
    {
      "href": "/integrations",
      "title": "Integrations",
      "icon": "code"
    }
  ],
  "paymentMethods": [
    {
      "id": "card",
      "name": "International cards",
      "shortName": "Cards",
      "description": "Card payments for international customers.",
      "incomingPercent": 10,
      "incomingFixedMinor": 50,
      "incomingFixedCurrency": "USD",
      "payoutPercent": 4,
      "payoutFixedMinor": 0,
      "payoutFixedCurrency": "USD",
      "vatApplies": true,
      "region": "International payments",
      "symbol": "card",
      "geography": "Visa and Mastercard from more than 190 countries, except the restriction list and five regions of Ukraine.",
      "countryCount": 223,
      "ownerReportedCountryCount": null,
      "coverageLabel": "190+"
    },
    {
      "id": "sbp",
      "name": "SBP",
      "shortName": "SBP",
      "description": "Pay through a bank with Russia’s Faster Payments System.",
      "incomingPercent": 8,
      "incomingFixedMinor": 0,
      "incomingFixedCurrency": "RUB",
      "payoutPercent": 5,
      "payoutFixedMinor": 40000,
      "payoutFixedCurrency": "RUB",
      "vatApplies": false,
      "region": "Russia",
      "symbol": "sbp",
      "geography": "Russia. Availability depends on the bank and transaction.",
      "countryCount": 1
    },
    {
      "id": "alipay",
      "name": "Alipay",
      "shortName": "Alipay",
      "description": "Alipay payments for customers in China.",
      "incomingPercent": 10,
      "incomingFixedMinor": 50,
      "incomingFixedCurrency": "USD",
      "payoutPercent": 4,
      "payoutFixedMinor": 0,
      "payoutFixedCurrency": "USD",
      "vatApplies": true,
      "region": "China",
      "symbol": "alipay",
      "geography": "China. Availability depends on the account and transaction.",
      "countryCount": 1
    },
    {
      "id": "crypto",
      "name": "Cryptocurrency",
      "shortName": "Crypto",
      "description": "One-time crypto payments with a 4% fee and no VAT.",
      "incomingPercent": 4,
      "incomingFixedMinor": 0,
      "incomingFixedCurrency": "USD",
      "payoutPercent": 0,
      "payoutFixedMinor": 300,
      "payoutFixedCurrency": "USD",
      "vatApplies": false,
      "region": "Digital assets",
      "symbol": "crypto",
      "geography": "All countries worldwide. Choose a supported coin and network. Payouts use USDT TRC20.",
      "countryCount": null
    }
  ],
  "payoutFees": {
    "card": "4%",
    "alipay": "4%",
    "sbp": "5% + RUB 400",
    "crypto": "0% + $3"
  }
}
