{
  "brand": "Kevmi",
  "version": "2026-10-23.16",
  "updatedAt": "2026-10-23",
  "articles": [
    {
      "id": "quickstart",
      "title": "Início rápido",
      "summary": "Explore seu espaço de trabalho, configure sua loja e veja uma fatura como seu cliente a verá. Este guia apresenta as principais etapas em ordem.",
      "group": "start",
      "url": "/docs/quickstart",
      "tags": [
        "início",
        "configuração",
        "primeiro pagamento",
        "início rápido"
      ],
      "sections": [
        {
          "id": "explore",
          "title": "1. Explore o produto",
          "paragraphs": [
            "Abra o espaço de trabalho de demonstração para criar um pedido de teste, explorar links de pagamento e verificar o cálculo de taxas. A demonstração usa dados de teste separados. Ela não cria um pagamento bancário nem transfere fundos para uma carteira."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Abrir o espaço de trabalho de demonstração",
              "href": "/demo/index.html"
            },
            {
              "label": "Pré-visualizar checkout",
              "href": "/pay/demo"
            }
          ]
        },
        {
          "id": "account",
          "title": "2. Crie uma conta com o Telegram",
          "paragraphs": [
            "Após o login pelo Telegram, a conta do comerciante é aberta. A integração pelo site está em /account#applications; tanto o formulário quanto o acompanhamento individual em /account#applications/{id} permanecem dentro do aplicativo.",
            "Um novo pagamento e uma intenção de cartão exigem que a solicitação mais recente de revisão do site do comerciante seja aprovada. A aprovação por si só não conecta o gateway de pagamento. Se a revisão mudar após o envio, a operação existente permanece disponível para leitura de status, conciliação e um código bancário solicitado."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Abrir sua conta",
              "href": "/account"
            }
          ]
        },
        {
          "id": "settings",
          "title": "3. Configure sua loja",
          "paragraphs": [],
          "bullets": [],
          "steps": [
            "Escolha um nome de loja que seu cliente reconhecerá.",
            "Escolha uma regra padrão de IVA (imposto sobre valor agregado). Cada nova fatura aceita separadamente as parcelas de taxa do cliente e de IVA de 0 a 100%.",
            "Selecione as notificações que deseja receber no Telegram.",
            "Use a calculadora para verificar um valor típico de pedido."
          ],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Calcular taxas e IVA",
              "href": "/pricing"
            }
          ]
        },
        {
          "id": "invoice",
          "title": "4. Prepare um link de pagamento",
          "paragraphs": [
            "Insira um título claro de pedido, um valor e uma moeda. O cliente recebe uma página dedicada com os detalhes da compra e o total devido. Uma fatura existente mantém seus termos originais quando as configurações da sua loja mudam."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Guia de links de pagamento",
              "href": "/docs/payment-links"
            }
          ]
        },
        {
          "id": "activate",
          "title": "5. Verifique a disponibilidade do pagamento",
          "paragraphs": [
            "Gerencie faturas, chaves de API, widgets e webhooks pela sua conta. Antes do pagamento, a Kevmi verifica a configuração do gateway, a aprovação do comerciante, o valor e os termos da fatura. Se o método selecionado não estiver disponível, o checkout explica o motivo.",
            "As faturas do novo workspace usam um preço base em USD e o plano Any oferece todos os quatro métodos. O SBP converte para RUB à taxa de referência congelada do Banco da Rússia; cripto usa a regra explícita de fatura 1:1 USD/USDT. O preço nativo legado permanece disponível para faturas antigas e solicitações de API sem pricingMode=universal. Consulte a seção de múltiplas lojas e preço em USD abaixo.",
            "Para um novo pagamento ao vivo com cartão ou Alipay, o gateway atual suporta apenas feeCustomerPercent=0 e vatCustomerPercent=100: o comerciante cobre toda a taxa de processamento e o IVA é adicionado integralmente para o cliente. Outras parcelas podem ser salvas e calculadas em uma fatura, mas a execução é bloqueada com unsupported_allocation. O servidor nunca altera silenciosamente os termos salvos. Pagamentos SBP e USDT cripto suportam todas as parcelas de taxa de processamento e não têm IVA."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "Criar uma fatura, chave ou solicitação não cobra dinheiro. A criação de saques pela API não está disponível; os termos de retirada são abordados em um guia separado.",
          "links": [
            {
              "label": "Requisitos de integração do gateway",
              "href": "/docs/gateway"
            }
          ]
        },
        {
          "id": "stores-usd",
          "title": "Múltiplas lojas e um preço base em USD",
          "paragraphs": [
            "Escolha Todas as lojas para análises e operações agregadas, ou selecione uma loja para seus próprios registros. Cada loja tem um storeId separado, nome, padrão de IVA, faturas, chaves de API, endpoints de webhook, histórico de eventos e aplicativo de site. Notificações e tickets de suporte pertencem à conta. Uma conta pode criar até 100 lojas. Registros existentes permanecem na primeira loja.",
            "As faturas do novo workspace usam pricingMode=\"universal\" e um preço base em USD. O plano Any inclui cartão, alipay, sbp e cripto; um comerciante pode selecionar um subconjunto. Cartões e Alipay cobram em USD. O SBP cobra em RUB usando a taxa de referência USD/RUB do Banco da Rússia. Cripto cobra USDT sob a regra explícita de fatura 1 USD = 1 USDT. Esta é uma regra de conversão de fatura, não uma cotação de mercado de USDT. O gateway fornece a taxa da moeda selecionada, o valor exato da transferência e instruções antes da transferência.",
            "A taxa de referência e ambos os valores são congelados na criação. Faturas que envolvem conversão RUB expiram dentro de 24 horas. Se a taxa de referência não puder ser obtida, a criação falha com FX_UNAVAILABLE; nenhuma taxa de fallback inventada ou desatualizada é usada. O valor do proprietário em minor e cotações usam a moeda contábil USD. quotes[method].settlement contém a cotação de cobrança nativa. O checkout público expõe a moeda de cobrança selecionada em currency, o preço original em baseAmountMinor/baseCurrency, e a taxa de referência em fx. Uma vez que um pagamento foi enviado, seu método não pode ser alterado; uma fatura tem uma operação de gateway.",
            "Crie uma chave de API dentro da loja pretendida e envie Authorization: Bearer <key> do seu servidor. Seu vínculo de loja é imutável; X-Kevmi-Store não pode conceder acesso a outra loja. Sessões de navegador selecionam X-Kevmi-Store: <storeId>; omitir seleciona a primeira loja. O valor all é aceito apenas por GET /api/account/dashboard e GET /api/payment-links. Mutações exigem uma loja selecionada, Origin e X-CSRF-Token. IDs de conta e IDs de loja são identificadores diferentes.",
            "Para compatibilidade, solicitações de API sem pricingMode=\"universal\" mantêm preço nativo e as restrições originais de moeda. Faturas existentes nunca são recalculadas. Recibos confirmados nas análises refletem pagamentos verificados menos despesas de fatura salvas; eles não são um saldo sacável. Moedas de fatura legadas permanecem separadas e pagamentos são combinados com o suporte. Cumpra um pedido somente após verificar payment.fulfillmentReady=true e payment.status=\"succeeded\" através da API do servidor, histórico de eventos ou um webhook assinado."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        }
      ],
      "body": "1. Explore o produto\n\nAbra o espaço de trabalho de demonstração para criar um pedido de teste, explorar links de pagamento e verificar o cálculo de taxas. A demonstração usa dados de teste separados. Ela não cria um pagamento bancário nem transfere fundos para uma carteira.\n\nAbrir o espaço de trabalho de demonstração\n\nPré-visualizar checkout\n\n2. Crie uma conta com o Telegram\n\nApós o login pelo Telegram, a conta do comerciante é aberta. A integração pelo site está em /account#applications; tanto o formulário quanto o acompanhamento individual em /account#applications/{id} permanecem dentro do aplicativo.\n\nUm novo pagamento e uma intenção de cartão exigem que a solicitação mais recente de revisão do site do comerciante seja aprovada. A aprovação por si só não conecta o gateway de pagamento. Se a revisão mudar após o envio, a operação existente permanece disponível para leitura de status, conciliação e um código bancário solicitado.\n\nAbrir sua conta\n\n3. Configure sua loja\n\nEscolha um nome de loja que seu cliente reconhecerá.\n\nEscolha uma regra padrão de IVA (imposto sobre valor agregado). Cada nova fatura aceita separadamente as parcelas de taxa do cliente e de IVA de 0 a 100%.\n\nSelecione as notificações que deseja receber no Telegram.\n\nUse a calculadora para verificar um valor típico de pedido.\n\nCalcular taxas e IVA\n\n4. Prepare um link de pagamento\n\nInsira um título claro de pedido, um valor e uma moeda. O cliente recebe uma página dedicada com os detalhes da compra e o total devido. Uma fatura existente mantém seus termos originais quando as configurações da sua loja mudam.\n\nGuia de links de pagamento\n\n5. Verifique a disponibilidade do pagamento\n\nGerencie faturas, chaves de API, widgets e webhooks pela sua conta. Antes do pagamento, a Kevmi verifica a configuração do gateway, a aprovação do comerciante, o valor e os termos da fatura. Se o método selecionado não estiver disponível, o checkout explica o motivo.\n\nAs faturas do novo workspace usam um preço base em USD e o plano Any oferece todos os quatro métodos. O SBP converte para RUB à taxa de referência congelada do Banco da Rússia; cripto usa a regra explícita de fatura 1:1 USD/USDT. O preço nativo legado permanece disponível para faturas antigas e solicitações de API sem pricingMode=universal. Consulte a seção de múltiplas lojas e preço em USD abaixo.\n\nPara um novo pagamento ao vivo com cartão ou Alipay, o gateway atual suporta apenas feeCustomerPercent=0 e vatCustomerPercent=100: o comerciante cobre toda a taxa de processamento e o IVA é adicionado integralmente para o cliente. Outras parcelas podem ser salvas e calculadas em uma fatura, mas a execução é bloqueada com unsupported_allocation. O servidor nunca altera silenciosamente os termos salvos. Pagamentos SBP e USDT cripto suportam todas as parcelas de taxa de processamento e não têm IVA.\n\nCriar uma fatura, chave ou solicitação não cobra dinheiro. A criação de saques pela API não está disponível; os termos de retirada são abordados em um guia separado.\n\nRequisitos de integração do gateway\n\nMúltiplas lojas e um preço base em USD\n\nEscolha Todas as lojas para análises e operações agregadas, ou selecione uma loja para seus próprios registros. Cada loja tem um storeId separado, nome, padrão de IVA, faturas, chaves de API, endpoints de webhook, histórico de eventos e aplicativo de site. Notificações e tickets de suporte pertencem à conta. Uma conta pode criar até 100 lojas. Registros existentes permanecem na primeira loja.\n\nAs faturas do novo workspace usam pricingMode=\"universal\" e um preço base em USD. O plano Any inclui cartão, alipay, sbp e cripto; um comerciante pode selecionar um subconjunto. Cartões e Alipay cobram em USD. O SBP cobra em RUB usando a taxa de referência USD/RUB do Banco da Rússia. Cripto cobra USDT sob a regra explícita de fatura 1 USD = 1 USDT. Esta é uma regra de conversão de fatura, não uma cotação de mercado de USDT. O gateway fornece a taxa da moeda selecionada, o valor exato da transferência e instruções antes da transferência.\n\nA taxa de referência e ambos os valores são congelados na criação. Faturas que envolvem conversão RUB expiram dentro de 24 horas. Se a taxa de referência não puder ser obtida, a criação falha com FX_UNAVAILABLE; nenhuma taxa de fallback inventada ou desatualizada é usada. O valor do proprietário em minor e cotações usam a moeda contábil USD. quotes[method].settlement contém a cotação de cobrança nativa. O checkout público expõe a moeda de cobrança selecionada em currency, o preço original em baseAmountMinor/baseCurrency, e a taxa de referência em fx. Uma vez que um pagamento foi enviado, seu método não pode ser alterado; uma fatura tem uma operação de gateway.\n\nCrie uma chave de API dentro da loja pretendida e envie Authorization: Bearer <key> do seu servidor. Seu vínculo de loja é imutável; X-Kevmi-Store não pode conceder acesso a outra loja. Sessões de navegador selecionam X-Kevmi-Store: <storeId>; omitir seleciona a primeira loja. O valor all é aceito apenas por GET /api/account/dashboard e GET /api/payment-links. Mutações exigem uma loja selecionada, Origin e X-CSRF-Token. IDs de conta e IDs de loja são identificadores diferentes.\n\nPara compatibilidade, solicitações de API sem pricingMode=\"universal\" mantêm preço nativo e as restrições originais de moeda. Faturas existentes nunca são recalculadas. Recibos confirmados nas análises refletem pagamentos verificados menos despesas de fatura salvas; eles não são um saldo sacável. Moedas de fatura legadas permanecem separadas e pagamentos são combinados com o suporte. Cumpra um pedido somente após verificar payment.fulfillmentReady=true e payment.status=\"succeeded\" através da API do servidor, histórico de eventos ou um webhook assinado.",
      "readMinutes": 3
    },
    {
      "id": "overview",
      "title": "Como a Kevmi funciona",
      "summary": "A Kevmi reúne faturas individuais, métodos de pagamento e regras de preço em um único espaço de trabalho. Cada pedido é pago separadamente. Não há assinaturas nem cobranças recorrentes automáticas.",
      "group": "start",
      "url": "/docs/overview",
      "tags": [
        "visão geral",
        "pagamentos únicos",
        "espaço de trabalho",
        "sem assinaturas"
      ],
      "sections": [
        {
          "id": "roles",
          "title": "O comerciante e o cliente",
          "paragraphs": [
            "O comerciante define um título de pedido, preço base, moeda e alocação de impostos. O cliente abre uma página de checkout dedicada, escolhe um método disponível e vê o total antes de confirmar.",
            "O cliente não precisa de acesso ao espaço de trabalho do comerciante. O checkout expõe os detalhes de um pedido, não o saldo da loja, configurações ou outros registros de clientes."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "channels",
          "title": "Quatro canais de pagamento",
          "paragraphs": [],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Método",
              "Público",
              "Taxa de aceitação"
            ],
            "rows": [
              [
                "Cartões internacionais",
                "Clientes internacionais",
                "10% + US$ 0,50; 16% de IVA"
              ],
              [
                "SBP",
                "Clientes na Rússia",
                "8%; sem IVA"
              ],
              [
                "Alipay",
                "Clientes na China",
                "10% + US$ 0,50; 16% de IVA"
              ],
              [
                "Criptomoeda",
                "Pagamentos cripto",
                "4%; sem IVA"
              ]
            ]
          },
          "code": null,
          "note": "Visa e Mastercard estão disponíveis em mais de 190 países, exceto nas restrições publicadas. A criptomoeda está disponível em todos os países.",
          "links": [
            {
              "label": "Países e restrições",
              "href": "/docs/geography"
            }
          ]
        },
        {
          "id": "workspace",
          "title": "Dentro do seu espaço de trabalho",
          "paragraphs": [
            "Os registros do servidor pertencem à conta verificada. A demonstração é separada e não pode criar pagamentos ao vivo nem um saldo passível de retirada."
          ],
          "bullets": [
            "Links de pagamento e termos de pedido: /account#links.",
            "Solicitações de site e acompanhamento individual: /account#applications.",
            "Chaves de API, webhooks, widget e eventos: /account#keys, #webhooks, #widget, #events.",
            "Preços, calculadora, mapa de países e documentação completa: /account#knowledge.",
            "As configurações da loja, notificações do Telegram e solicitações de suporte permanecem na mesma conta."
          ],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "money",
          "title": "Entendendo os valores",
          "paragraphs": [
            "O preço base é o preço do bem ou serviço antes da alocação de custos. A taxa e o IVA usam esse base de forma independente. As parcelas do cliente são adicionadas no checkout; as parcelas da loja são deduzidas do preço base. O IVA de cartão e Alipay é de 16%, com controle separado da alocação de taxa e IVA.",
            "A comissão da plataforma Kevmi já está incluída nas taxas publicadas. Não há sobretaxa adicional de 5%. Um pagamento USDT TRC20 tem uma taxa separada com base na origem dos fundos e em uma cotação de conversão explícita."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Todas as taxas",
              "href": "/pricing"
            }
          ]
        },
        {
          "id": "availability",
          "title": "Acesso aos recursos",
          "paragraphs": [
            "Documentação, calculadora e assistente de documentação estão disponíveis sem login. Configurações da loja, links de pagamento e solicitações de suporte privadas exigem uma conta. A disponibilidade financeira é verificada separadamente, e um canal de pagamento indisponível é informado antes de uma cobrança."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        }
      ],
      "body": "O comerciante e o cliente\n\nO comerciante define um título de pedido, preço base, moeda e alocação de impostos. O cliente abre uma página de checkout dedicada, escolhe um método disponível e vê o total antes de confirmar.\n\nO cliente não precisa de acesso ao espaço de trabalho do comerciante. O checkout expõe os detalhes de um pedido, não o saldo da loja, configurações ou outros registros de clientes.\n\nQuatro canais de pagamento\n\nMétodo · Público · Taxa de aceitação\nCartões internacionais · Clientes internacionais · 10% + US$ 0,50; 16% de IVA\nSBP · Clientes na Rússia · 8%; sem IVA\nAlipay · Clientes na China · 10% + US$ 0,50; 16% de IVA\nCriptomoeda · Pagamentos cripto · 4%; sem IVA\n\nVisa e Mastercard estão disponíveis em mais de 190 países, exceto nas restrições publicadas. A criptomoeda está disponível em todos os países.\n\nPaíses e restrições\n\nDentro do seu espaço de trabalho\n\nOs registros do servidor pertencem à conta verificada. A demonstração é separada e não pode criar pagamentos ao vivo nem um saldo passível de retirada.\n\nLinks de pagamento e termos de pedido: /account#links.\n\nSolicitações de site e acompanhamento individual: /account#applications.\n\nChaves de API, webhooks, widget e eventos: /account#keys, #webhooks, #widget, #events.\n\nPreços, calculadora, mapa de países e documentação completa: /account#knowledge.\n\nAs configurações da loja, notificações do Telegram e solicitações de suporte permanecem na mesma conta.\n\nEntendendo os valores\n\nO preço base é o preço do bem ou serviço antes da alocação de custos. A taxa e o IVA usam esse base de forma independente. As parcelas do cliente são adicionadas no checkout; as parcelas da loja são deduzidas do preço base. O IVA de cartão e Alipay é de 16%, com controle separado da alocação de taxa e IVA.\n\nA comissão da plataforma Kevmi já está incluída nas taxas publicadas. Não há sobretaxa adicional de 5%. Um pagamento USDT TRC20 tem uma taxa separada com base na origem dos fundos e em uma cotação de conversão explícita.\n\nTodas as taxas\n\nAcesso aos recursos\n\nDocumentação, calculadora e assistente de documentação estão disponíveis sem login. Configurações da loja, links de pagamento e solicitações de suporte privadas exigem uma conta. A disponibilidade financeira é verificada separadamente, e um canal de pagamento indisponível é informado antes de uma cobrança.",
      "readMinutes": 3
    },
    {
      "id": "fees",
      "title": "Taxas de pagamento e pagamento",
      "summary": "A taxa de aceitação depende do método de pagamento e usa o preço base do pedido. A comissão da Kevmi está incluída. IVA e taxas de pagamento são mostrados separadamente.",
      "group": "payments",
      "url": "/docs/fees",
      "tags": [
        "taxas",
        "precificação",
        "custo",
        "pagamento",
        "comissão"
      ],
      "sections": [
        {
          "id": "incoming",
          "title": "Aceitando um pagamento",
          "paragraphs": [
            "Adicione os componentes percentual e fixo. Para um pedido com cartão de $5, a taxa é de $0,50 + $0,50 = $1. O IVA é de $0,80 e é separado dessa taxa.",
            "A parcela da plataforma, aproximadamente 5% em média, já está embutida nesses termos. Não adicione uma segunda porcentagem da plataforma."
          ],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Método",
              "Percentual",
              "Taxa fixa",
              "IVA"
            ],
            "rows": [
              [
                "Cartões internacionais",
                "10%",
                "$0,50",
                "16% do preço base"
              ],
              [
                "Alipay",
                "10%",
                "$0,50",
                "16% do preço base"
              ],
              [
                "SBP",
                "8%",
                "Nenhum",
                "Nenhum"
              ],
              [
                "Criptomoeda",
                "4%",
                "Nenhum",
                "Nenhum"
              ]
            ]
          },
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "payout",
          "title": "Retirando fundos",
          "paragraphs": [
            "A origem dos fundos e a rede de pagamento são configurações separadas. Usar TRC20 não torna todas as taxas de pagamento iguais. A taxa de pagamento é separada da taxa de aceitação.",
            "Mantenha a taxa fixa na moeda informada. Não deduza RUB 400 de um valor em USD nem assuma que $3 equivale a 3 USDT. O pagamento final exige uma cotação de conversão explícita."
          ],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Origem dos fundos",
              "Taxa de pagamento",
              "Destino"
            ],
            "rows": [
              [
                "Cartões",
                "4%",
                "USDT TRC20"
              ],
              [
                "Alipay",
                "4%",
                "USDT TRC20"
              ],
              [
                "SBP",
                "5% + RUB 400",
                "USDT TRC20"
              ],
              [
                "Criptomoeda",
                "0% + $3",
                "USDT TRC20"
              ]
            ]
          },
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "rounding",
          "title": "Precisão do cálculo",
          "paragraphs": [
            "O valor da fatura é um número inteiro: 500 significa 5,00 USD, RUB ou USDT na moeda explicitamente informada. Essas são unidades de cálculo de fatura; USD e USDT não são convertidos automaticamente. Taxas e IVA usam arredondamento separado para cima em caso de metade.",
            "Para uma transferência de criptomoeda, use o valor exato decimal da moeda e a rede retornados pela operação criada. Não derive o valor da transferência a partir do preço da fatura arredondado. Um cálculo não pode produzir receita negativa para a loja."
          ],
          "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": "Verifique antes de pagar",
          "paragraphs": [],
          "bullets": [
            "O valor e a moeda do pedido original.",
            "O método de pagamento, que determina a taxa e se o IVA se aplica.",
            "O pagador de IVA salvo com a fatura.",
            "O total do cliente e o crédito esperado da loja."
          ],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Calcule seu valor",
              "href": "/pricing"
            },
            {
              "label": "Entenda o IVA",
              "href": "/docs/vat"
            }
          ]
        }
      ],
      "body": "Aceitando um pagamento\n\nAdicione os componentes percentual e fixo. Para um pedido com cartão de $5, a taxa é de $0,50 + $0,50 = $1. O IVA é de $0,80 e é separado dessa taxa.\n\nA parcela da plataforma, aproximadamente 5% em média, já está embutida nesses termos. Não adicione uma segunda porcentagem da plataforma.\n\nMétodo · Percentual · Taxa fixa · IVA\nCartões internacionais · 10% · $0,50 · 16% do preço base\nAlipay · 10% · $0,50 · 16% do preço base\nSBP · 8% · Nenhum · Nenhum\nCriptomoeda · 4% · Nenhum · Nenhum\n\nRetirando fundos\n\nA origem dos fundos e a rede de pagamento são configurações separadas. Usar TRC20 não torna todas as taxas de pagamento iguais. A taxa de pagamento é separada da taxa de aceitação.\n\nMantenha a taxa fixa na moeda informada. Não deduza RUB 400 de um valor em USD nem assuma que $3 equivale a 3 USDT. O pagamento final exige uma cotação de conversão explícita.\n\nOrigem dos fundos · Taxa de pagamento · Destino\nCartões · 4% · USDT TRC20\nAlipay · 4% · USDT TRC20\nSBP · 5% + RUB 400 · USDT TRC20\nCriptomoeda · 0% + $3 · USDT TRC20\n\nPrecisão do cálculo\n\nO valor da fatura é um número inteiro: 500 significa 5,00 USD, RUB ou USDT na moeda explicitamente informada. Essas são unidades de cálculo de fatura; USD e USDT não são convertidos automaticamente. Taxas e IVA usam arredondamento separado para cima em caso de metade.\n\nPara uma transferência de criptomoeda, use o valor exato decimal da moeda e a rede retornados pela operação criada. Não derive o valor da transferência a partir do preço da fatura arredondado. Um cálculo não pode produzir receita negativa para a loja.\n\nfeeMinor = roundHalfUp(baseMinor × rate / 100) + fixedMinor\nvatMinor = roundHalfUp(baseMinor × 16 / 100)\n// For SBP and cryptocurrency, vatMinor = 0\n\nVerifique antes de pagar\n\nO valor e a moeda do pedido original.\n\nO método de pagamento, que determina a taxa e se o IVA se aplica.\n\nO pagador de IVA salvo com a fatura.\n\nO total do cliente e o crédito esperado da loja.\n\nCalcule seu valor\n\nEntenda o IVA",
      "readMinutes": 3
    },
    {
      "id": "vat",
      "title": "IVA e alocação de custos",
      "summary": "O IVA é de 16% do preço base do pedido para cartões internacionais e Alipay. A loja define uma parcela do cliente de 0% a 100% e cobre o restante com a receita. SBP e criptomoeda não têm IVA sob esses termos publicados.",
      "group": "payments",
      "url": "/docs/vat",
      "tags": [
        "IVA",
        "imposto",
        "cliente",
        "loja",
        "cinco dólares"
      ],
      "sections": [
        {
          "id": "base",
          "title": "Uma base para taxas e impostos",
          "paragraphs": [
            "O preço base é o valor do pedido informado pela loja. A taxa de 10% + $0,50 e o IVA de 16% são calculados de forma independente desse preço. A taxa não se aplica ao IVA adicionado por cima.",
            "Com um preço base de $5, a taxa é de $1 e o IVA é de $0,80. Alterar o pagador altera a alocação, não a alíquota nem a base de cálculo."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "customer",
          "title": "O cliente paga o IVA",
          "paragraphs": [
            "Esta é a regra de IVA padrão: uma parcela de 100% do cliente, equivalente ao valor legado do cliente. A loja cobre a taxa inteira neste exemplo. O IVA é adicionado ao preço base. O checkout mostra o preço do pedido, o IVA e o total devido.",
            "Apenas a taxa de aceitação é deduzida do preço base. Para um pedido de $5, o cliente paga $5,80 e a loja recebe $4."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": {
            "language": "Formula",
            "code": "customerTotalMinor = baseMinor + vatMinor\nmerchantNetMinor = baseMinor - feeMinor"
          },
          "note": "",
          "links": []
        },
        {
          "id": "merchant",
          "title": "A loja paga o IVA",
          "paragraphs": [
            "Neste exemplo, as parcelas do cliente são 0% tanto para o IVA quanto para a taxa. O valor legado de IVA da loja corresponde a uma parcela de IVA do cliente igual a zero; a loja cobre ambos os custos a partir do preço base.",
            "Para um pedido de $5, o cliente paga $5, a taxa é de $1, o IVA é de $0,80 e a loja recebe $3,20. O IVA permanece em 16% do preço base; não substitua essa regra por uma fórmula de 16/116."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": {
            "language": "Formula",
            "code": "customerTotalMinor = baseMinor\nmerchantNetMinor = baseMinor - feeMinor - vatMinor"
          },
          "note": "",
          "links": []
        },
        {
          "id": "comparison",
          "title": "Um exemplo lado a lado",
          "paragraphs": [],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Valor",
              "Cliente paga IVA",
              "Loja paga IVA"
            ],
            "rows": [
              [
                "Preço base do pedido",
                "$5,00",
                "$5,00"
              ],
              [
                "Taxa de aceitação",
                "$1,00",
                "$1,00"
              ],
              [
                "IVA",
                "$0,80",
                "$0,80"
              ],
              [
                "O cliente paga",
                "$5,80",
                "$5,00"
              ],
              [
                "O comerciante recebe",
                "$4,00",
                "$3,20"
              ]
            ]
          },
          "code": null,
          "note": "Ambas as colunas pressupõem uma participação de 0% nas taxas de processamento paga pelo cliente. Participações intermediárias de IVA e alocação separada de taxas estão disponíveis na calculadora.",
          "links": []
        },
        {
          "id": "snapshot",
          "title": "Quando a configuração se aplica",
          "paragraphs": [
            "A preferência da loja fornece a alocação inicial. A interface e a API salvam participações independentes de IVA do cliente e de taxas de processamento, de 0 a 100, para cada fatura. Alterações nas configurações da loja não recalculam faturas emitidas.",
            "Para um novo pagamento ao vivo com cartão ou Alipay, o gateway atual suporta apenas feeCustomerPercent=0 e vatCustomerPercent=100: o comerciante cobre toda a taxa de processamento e o IVA é adicionado integralmente para o cliente. Outras parcelas podem ser salvas e calculadas em uma fatura, mas a execução é bloqueada com unsupported_allocation. O servidor nunca altera silenciosamente os termos salvos. Pagamentos SBP e USDT cripto suportam todas as parcelas de taxa de processamento e não têm IVA.",
            "Crie um novo link para termos diferentes. O IVA é zero para SBP e criptomoeda."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Configurações da loja",
              "href": "/docs/settings"
            },
            {
              "label": "Verifique o cálculo",
              "href": "/pricing"
            },
            {
              "label": "Divida as taxas de processamento e o IVA",
              "href": "/docs/cost-sharing"
            }
          ]
        }
      ],
      "body": "Uma base para taxas e impostos\n\nO preço base é o valor do pedido informado pela loja. A taxa de 10% + $0,50 e o IVA de 16% são calculados de forma independente desse preço. A taxa não se aplica ao IVA adicionado por cima.\n\nCom um preço base de $5, a taxa é de $1 e o IVA é de $0,80. Alterar o pagador altera a alocação, não a alíquota nem a base de cálculo.\n\nO cliente paga o IVA\n\nEsta é a regra de IVA padrão: uma parcela de 100% do cliente, equivalente ao valor legado do cliente. A loja cobre a taxa inteira neste exemplo. O IVA é adicionado ao preço base. O checkout mostra o preço do pedido, o IVA e o total devido.\n\nApenas a taxa de aceitação é deduzida do preço base. Para um pedido de $5, o cliente paga $5,80 e a loja recebe $4.\n\ncustomerTotalMinor = baseMinor + vatMinor\nmerchantNetMinor = baseMinor - feeMinor\n\nA loja paga o IVA\n\nNeste exemplo, as parcelas do cliente são 0% tanto para o IVA quanto para a taxa. O valor legado de IVA da loja corresponde a uma parcela de IVA do cliente igual a zero; a loja cobre ambos os custos a partir do preço base.\n\nPara um pedido de $5, o cliente paga $5, a taxa é de $1, o IVA é de $0,80 e a loja recebe $3,20. O IVA permanece em 16% do preço base; não substitua essa regra por uma fórmula de 16/116.\n\ncustomerTotalMinor = baseMinor\nmerchantNetMinor = baseMinor - feeMinor - vatMinor\n\nUm exemplo lado a lado\n\nValor · Cliente paga IVA · Loja paga IVA\nPreço base do pedido · $5,00 · $5,00\nTaxa de aceitação · $1,00 · $1,00\nIVA · $0,80 · $0,80\nO cliente paga · $5,80 · $5,00\nO comerciante recebe · $4,00 · $3,20\n\nAmbas as colunas pressupõem uma participação de 0% nas taxas de processamento paga pelo cliente. Participações intermediárias de IVA e alocação separada de taxas estão disponíveis na calculadora.\n\nQuando a configuração se aplica\n\nA preferência da loja fornece a alocação inicial. A interface e a API salvam participações independentes de IVA do cliente e de taxas de processamento, de 0 a 100, para cada fatura. Alterações nas configurações da loja não recalculam faturas emitidas.\n\nPara um novo pagamento ao vivo com cartão ou Alipay, o gateway atual suporta apenas feeCustomerPercent=0 e vatCustomerPercent=100: o comerciante cobre toda a taxa de processamento e o IVA é adicionado integralmente para o cliente. Outras parcelas podem ser salvas e calculadas em uma fatura, mas a execução é bloqueada com unsupported_allocation. O servidor nunca altera silenciosamente os termos salvos. Pagamentos SBP e USDT cripto suportam todas as parcelas de taxa de processamento e não têm IVA.\n\nCrie um novo link para termos diferentes. O IVA é zero para SBP e criptomoeda.\n\nConfigurações da loja\n\nVerifique o cálculo\n\nDivida as taxas de processamento e o IVA",
      "readMinutes": 4
    },
    {
      "id": "geography",
      "title": "Países e métodos de pagamento",
      "summary": "Visa e Mastercard cobrem mais de 190 países, exceto as restrições publicadas. SBP atende a Rússia, Alipay atende à China, e criptomoeda está disponível mundialmente.",
      "group": "payments",
      "url": "/docs/geography",
      "tags": [
        "países",
        "cobertura",
        "190+",
        "Rússia",
        "China",
        "Ilhas Åland",
        "Albânia",
        "Argélia",
        "Samoa Americana",
        "Andorra",
        "Angola",
        "Anguila",
        "Antígua e Barbuda",
        "Argentina",
        "Armênia",
        "Aruba",
        "Austrália",
        "Áustria",
        "Azerbaijão",
        "Bahamas",
        "Bahrein",
        "Bangladesh",
        "Barbados",
        "Bélgica",
        "Belize",
        "Benim",
        "Bermudas",
        "Butão",
        "Bolívia",
        "Países Baixos Caribenhos",
        "Bósnia e Herzegovina",
        "Botsuana",
        "Ilha Bouvet",
        "Brasil",
        "Território Britânico do Oceano Índico",
        "Brunei",
        "Bulgária",
        "Burkina Faso",
        "Cabo Verde",
        "Camboja",
        "Camarões",
        "Canadá",
        "Ilhas Cayman",
        "Chile",
        "China",
        "Ilha Christmas",
        "Ilhas Cocos (Keeling)",
        "Colômbia",
        "Comores",
        "Ilhas Cook",
        "Costa Rica",
        "Croácia",
        "Curaçau",
        "Chipre",
        "Chéquia",
        "Costa do Marfim",
        "Dinamarca",
        "Djibouti",
        "Dominica",
        "República Dominicana",
        "Equador",
        "Egito",
        "El Salvador",
        "Guiné Equatorial",
        "Estónia",
        "Essuatíni",
        "Etiópia",
        "Ilhas Falkland",
        "Ilhas Faroé",
        "Micronésia",
        "Fiji",
        "Finlândia",
        "França",
        "Guiana Francesa",
        "Polinésia Francesa",
        "Territórios Franceses do Sul",
        "Gabão",
        "Gâmbia",
        "Geórgia",
        "Alemanha",
        "Gana",
        "Gibraltar",
        "Grécia",
        "Groenlândia",
        "Granada",
        "Guadalupe",
        "Guam",
        "Guatemala",
        "Guernsey",
        "Guiné",
        "Guiné-Bissau",
        "Guiana",
        "Ilhas Heard e McDonald",
        "Cidade do Vaticano",
        "Honduras",
        "Região Administrativa Especial de Hong Kong, China",
        "Hungria",
        "Islândia",
        "Índia",
        "Indonésia",
        "Irlanda",
        "Ilha de Man",
        "Israel",
        "Itália",
        "Jamaica",
        "Japão",
        "Jersey",
        "Jordânia",
        "Cazaquistão",
        "Quénia",
        "Quiribati",
        "Kuwait",
        "Quirguistão",
        "Laos",
        "Letônia",
        "Líbano",
        "Lesoto",
        "Libéria",
        "Liechtenstein",
        "Lituânia",
        "Luxemburgo",
        "Macau RAEC China",
        "Madagascar",
        "Malaui",
        "Malásia",
        "Maldivas",
        "Malta",
        "Ilhas Marshall",
        "Martinica",
        "Mauritânia",
        "Maurício",
        "Mayotte",
        "México",
        "Moldávia",
        "Mônaco",
        "Mongólia",
        "Montenegro",
        "Montserrat",
        "Marrocos",
        "Moçambique",
        "Namíbia",
        "Nauru",
        "Nepal",
        "Países Baixos",
        "Nova Caledônia",
        "Nova Zelândia",
        "Níger",
        "Nigéria",
        "Niue",
        "Ilha Norfolk",
        "Macedônia do Norte",
        "Ilhas Marianas Setentrionais",
        "Noruega",
        "Omã",
        "Paquistão",
        "Palau",
        "Panamá",
        "Papua-Nova Guiné",
        "Paraguai",
        "Peru",
        "Filipinas",
        "Ilhas Pitcairn",
        "Polônia",
        "Portugal",
        "Porto Rico",
        "Qatar",
        "Romênia",
        "Ruanda",
        "Reunião",
        "St. Barthélemy",
        "Santa Helena",
        "São Cristóvão e Nevis",
        "Santa Lúcia",
        "São Martinho",
        "São Pedro e Miquelon",
        "São Vicente e Granadinas",
        "Samoa",
        "San Marino",
        "São Tomé e Príncipe",
        "Arábia Saudita",
        "Senegal",
        "Sérvia",
        "Seicheles",
        "Serra Leoa",
        "Singapura",
        "Sint Maarten",
        "Eslováquia",
        "Eslovênia",
        "Ilhas Salomão",
        "África do Sul",
        "Geórgia do Sul e Ilhas Sandwich do Sul",
        "Coreia do Sul",
        "Espanha",
        "Sri Lanka",
        "Territórios Palestinos",
        "Suriname",
        "Svalbard e Jan Mayen",
        "Suécia",
        "Suíça",
        "Taiwan",
        "Tadjiquistão",
        "Tanzânia",
        "Tailândia",
        "Timor-Leste",
        "Togo",
        "Tokelau",
        "Tonga",
        "Trinidad e Tobago",
        "Tunísia",
        "Turcomenistão",
        "Ilhas Turcas e Caicos",
        "Tuvalu",
        "Türkiye",
        "Uganda",
        "Ucrânia",
        "Emirados Árabes Unidos",
        "Reino Unido",
        "Ilhas Menores Distantes dos EUA",
        "Estados Unidos",
        "Uruguai",
        "Uzbequistão",
        "Vanuatu",
        "Vietnã",
        "Ilhas Virgens Britânicas",
        "Ilhas Virgens dos EUA",
        "Wallis e Futuna",
        "Saara Ocidental",
        "Zâmbia"
      ],
      "sections": [
        {
          "id": "coverage",
          "title": "Cobertura por canal",
          "paragraphs": [],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Canal",
              "Cobertura",
              "Condições"
            ],
            "rows": [
              [
                "Cartões internacionais",
                "Mais de 190 países",
                "Exceto a lista de restrições e cinco regiões da Ucrânia"
              ],
              [
                "SBP",
                "Rússia",
                "A disponibilidade depende do banco e da transação"
              ],
              [
                "Alipay",
                "China",
                "A disponibilidade depende da conta e da transação"
              ],
              [
                "Criptomoeda",
                "Todos os países",
                "Escolha uma moeda suportada e uma rede"
              ]
            ]
          },
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "map",
          "title": "O mapa interativo",
          "paragraphs": [
            "A página Geografia tem um mapa-múndi bidimensional. Os filtros destacam os países internacionais de cartão publicados, a Rússia para SBP e a China para Alipay. Pesquise por nome do país ou código ISO para ver seus métodos e notas.",
            "O hachurado marca a Ucrânia porque cinco regiões estão excluídas dos cartões. O restante da Ucrânia está disponível. As restrições de cartão não se aplicam a criptomoedas, que estão disponíveis em todos os países."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Abrir o mapa",
              "href": "/countries"
            }
          ]
        },
        {
          "id": "cards",
          "title": "O que a lista cobre",
          "paragraphs": [
            "A lista completa abaixo descreve a cobertura internacional de cartões. Os países de registro do comerciante e os destinos de pagamento têm condições separadas.",
            "A aprovação depende do país emissor, do banco, do tipo de cartão e das verificações do canal de pagamento. Um país estar na lista não garante aprovação para cada cartão ou transação."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "restrictions",
          "title": "Restrições de Visa e Mastercard",
          "paragraphs": [
            "Os cartões não estão disponíveis na Crimeia, Donetsk, Luhansk, Kherson e Zaporizhzhia. O restante da Ucrânia está disponível.",
            "Todos os outros países estão disponíveis. Antilhas Neerlandesas é preservada como uma entrada histórica da lista do provedor; ela não bloqueia qualquer território caribenho moderno."
          ],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Código",
              "País ou território"
            ],
            "rows": [
              [
                "AF",
                "Afeganistão"
              ],
              [
                "AQ",
                "Antártida"
              ],
              [
                "BY",
                "Bielorrússia"
              ],
              [
                "MM",
                "Birmânia (Mianmar)"
              ],
              [
                "BI",
                "Burundi"
              ],
              [
                "CF",
                "República Centro-Africana"
              ],
              [
                "TD",
                "Chade"
              ],
              [
                "CU",
                "Cuba"
              ],
              [
                "CD",
                "República Democrática do Congo"
              ],
              [
                "CG",
                "República do Congo"
              ],
              [
                "ER",
                "Eritreia"
              ],
              [
                "HT",
                "Haiti"
              ],
              [
                "IR",
                "Irã"
              ],
              [
                "IQ",
                "Iraque"
              ],
              [
                "LY",
                "Líbia"
              ],
              [
                "ML",
                "Mali"
              ],
              [
                "NI",
                "Nicarágua"
              ],
              [
                "KP",
                "Coreia do Norte"
              ],
              [
                "RU",
                "Rússia"
              ],
              [
                "SO",
                "Somália"
              ],
              [
                "SS",
                "Sudão do Sul"
              ],
              [
                "SD",
                "Sudão"
              ],
              [
                "SY",
                "Síria"
              ],
              [
                "VE",
                "Venezuela"
              ],
              [
                "YE",
                "Iêmen"
              ],
              [
                "ZW",
                "Zimbábue"
              ],
              [
                "UA-43",
                "Crimeia (Região da Ucrânia)"
              ],
              [
                "UA-14",
                "Donetsk (Região da Ucrânia)"
              ],
              [
                "UA-65",
                "Kherson (Região da Ucrânia)"
              ],
              [
                "UA-09",
                "Luhansk (Região da Ucrânia)"
              ],
              [
                "UA-23",
                "Zaporizhzhia (Região da Ucrânia)"
              ],
              [
                "AN",
                "Antilhas Neerlandesas"
              ]
            ]
          },
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "card-list",
          "title": "Diretório de países e territórios",
          "paragraphs": [
            "Nomes, códigos ISO e marcadores vêm do registro compartilhado de países. Essas notas se aplicam a cartões internacionais."
          ],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "ISO",
              "País ou território",
              "Nota"
            ],
            "rows": [
              [
                "AX",
                "Ilhas Åland",
                "—"
              ],
              [
                "AL",
                "Albânia",
                "—"
              ],
              [
                "DZ",
                "Argélia",
                "—"
              ],
              [
                "AS",
                "Samoa Americana",
                "—"
              ],
              [
                "AD",
                "Andorra",
                "—"
              ],
              [
                "AO",
                "Angola",
                "—"
              ],
              [
                "AI",
                "Anguila",
                "—"
              ],
              [
                "AG",
                "Antígua e Barbuda",
                "—"
              ],
              [
                "AR",
                "Argentina",
                "—"
              ],
              [
                "AM",
                "Armênia",
                "—"
              ],
              [
                "AW",
                "Aruba",
                "—"
              ],
              [
                "AU",
                "Austrália",
                "—"
              ],
              [
                "AT",
                "Áustria",
                "—"
              ],
              [
                "AZ",
                "Azerbaijão",
                "—"
              ],
              [
                "BS",
                "Bahamas",
                "—"
              ],
              [
                "BH",
                "Bahrein",
                "—"
              ],
              [
                "BD",
                "Bangladesh",
                "—"
              ],
              [
                "BB",
                "Barbados",
                "—"
              ],
              [
                "BE",
                "Bélgica",
                "—"
              ],
              [
                "BZ",
                "Belize",
                "—"
              ],
              [
                "BJ",
                "Benim",
                "—"
              ],
              [
                "BM",
                "Bermudas",
                "—"
              ],
              [
                "BT",
                "Butão",
                "—"
              ],
              [
                "BO",
                "Bolívia",
                "—"
              ],
              [
                "BQ",
                "Países Baixos Caribenhos",
                "—"
              ],
              [
                "BA",
                "Bósnia e Herzegovina",
                "—"
              ],
              [
                "BW",
                "Botsuana",
                "—"
              ],
              [
                "BV",
                "Ilha Bouvet",
                "—"
              ],
              [
                "BR",
                "Brasil",
                "—"
              ],
              [
                "IO",
                "Território Britânico do Oceano Índico",
                "—"
              ],
              [
                "BN",
                "Brunei",
                "—"
              ],
              [
                "BG",
                "Bulgária",
                "—"
              ],
              [
                "BF",
                "Burkina Faso",
                "—"
              ],
              [
                "CV",
                "Cabo Verde",
                "—"
              ],
              [
                "KH",
                "Camboja",
                "—"
              ],
              [
                "CM",
                "Camarões",
                "—"
              ],
              [
                "CA",
                "Canadá",
                "—"
              ],
              [
                "KY",
                "Ilhas Cayman",
                "—"
              ],
              [
                "CL",
                "Chile",
                "—"
              ],
              [
                "CN",
                "China",
                "—"
              ],
              [
                "CX",
                "Ilha Christmas",
                "—"
              ],
              [
                "CC",
                "Ilhas Cocos (Keeling)",
                "—"
              ],
              [
                "CO",
                "Colômbia",
                "—"
              ],
              [
                "KM",
                "Comores",
                "—"
              ],
              [
                "CK",
                "Ilhas Cook",
                "—"
              ],
              [
                "CR",
                "Costa Rica",
                "—"
              ],
              [
                "HR",
                "Croácia",
                "—"
              ],
              [
                "CW",
                "Curaçau",
                "—"
              ],
              [
                "CY",
                "Chipre",
                "—"
              ],
              [
                "CZ",
                "Chéquia",
                "—"
              ],
              [
                "CI",
                "Costa do Marfim",
                "—"
              ],
              [
                "DK",
                "Dinamarca",
                "—"
              ],
              [
                "DJ",
                "Djibouti",
                "—"
              ],
              [
                "DM",
                "Dominica",
                "—"
              ],
              [
                "DO",
                "República Dominicana",
                "—"
              ],
              [
                "EC",
                "Equador",
                "—"
              ],
              [
                "EG",
                "Egito",
                "—"
              ],
              [
                "SV",
                "El Salvador",
                "—"
              ],
              [
                "GQ",
                "Guiné Equatorial",
                "—"
              ],
              [
                "EE",
                "Estónia",
                "—"
              ],
              [
                "SZ",
                "Essuatíni",
                "—"
              ],
              [
                "ET",
                "Etiópia",
                "—"
              ],
              [
                "FK",
                "Ilhas Falkland",
                "—"
              ],
              [
                "FO",
                "Ilhas Faroé",
                "—"
              ],
              [
                "FM",
                "Micronésia",
                "—"
              ],
              [
                "FJ",
                "Fiji",
                "—"
              ],
              [
                "FI",
                "Finlândia",
                "—"
              ],
              [
                "FR",
                "França",
                "—"
              ],
              [
                "GF",
                "Guiana Francesa",
                "—"
              ],
              [
                "PF",
                "Polinésia Francesa",
                "—"
              ],
              [
                "TF",
                "Territórios Franceses do Sul",
                "—"
              ],
              [
                "GA",
                "Gabão",
                "—"
              ],
              [
                "GM",
                "Gâmbia",
                "—"
              ],
              [
                "GE",
                "Geórgia",
                "—"
              ],
              [
                "DE",
                "Alemanha",
                "—"
              ],
              [
                "GH",
                "Gana",
                "—"
              ],
              [
                "GI",
                "Gibraltar",
                "—"
              ],
              [
                "GR",
                "Grécia",
                "—"
              ],
              [
                "GL",
                "Groenlândia",
                "—"
              ],
              [
                "GD",
                "Granada",
                "—"
              ],
              [
                "GP",
                "Guadalupe",
                "—"
              ],
              [
                "GU",
                "Guam",
                "—"
              ],
              [
                "GT",
                "Guatemala",
                "—"
              ],
              [
                "GG",
                "Guernsey",
                "—"
              ],
              [
                "GN",
                "Guiné",
                "—"
              ],
              [
                "GW",
                "Guiné-Bissau",
                "—"
              ],
              [
                "GY",
                "Guiana",
                "—"
              ],
              [
                "HM",
                "Ilhas Heard e McDonald",
                "—"
              ],
              [
                "VA",
                "Cidade do Vaticano",
                "—"
              ],
              [
                "HN",
                "Honduras",
                "—"
              ],
              [
                "HK",
                "Região Administrativa Especial de Hong Kong, China",
                "—"
              ],
              [
                "HU",
                "Hungria",
                "—"
              ],
              [
                "IS",
                "Islândia",
                "—"
              ],
              [
                "IN",
                "Índia",
                "—"
              ],
              [
                "ID",
                "Indonésia",
                "—"
              ],
              [
                "IE",
                "Irlanda",
                "—"
              ],
              [
                "IM",
                "Ilha de Man",
                "—"
              ],
              [
                "IL",
                "Israel",
                "—"
              ],
              [
                "IT",
                "Itália",
                "—"
              ],
              [
                "JM",
                "Jamaica",
                "—"
              ],
              [
                "JP",
                "Japão",
                "—"
              ],
              [
                "JE",
                "Jersey",
                "—"
              ],
              [
                "JO",
                "Jordânia",
                "—"
              ],
              [
                "KZ",
                "Cazaquistão",
                "—"
              ],
              [
                "KE",
                "Quénia",
                "—"
              ],
              [
                "KI",
                "Quiribati",
                "—"
              ],
              [
                "KW",
                "Kuwait",
                "—"
              ],
              [
                "KG",
                "Quirguistão",
                "—"
              ],
              [
                "LA",
                "Laos",
                "—"
              ],
              [
                "LV",
                "Letônia",
                "—"
              ],
              [
                "LB",
                "Líbano",
                "—"
              ],
              [
                "LS",
                "Lesoto",
                "—"
              ],
              [
                "LR",
                "Libéria",
                "—"
              ],
              [
                "LI",
                "Liechtenstein",
                "—"
              ],
              [
                "LT",
                "Lituânia",
                "—"
              ],
              [
                "LU",
                "Luxemburgo",
                "—"
              ],
              [
                "MO",
                "Macau RAEC China",
                "—"
              ],
              [
                "MG",
                "Madagascar",
                "—"
              ],
              [
                "MW",
                "Malaui",
                "—"
              ],
              [
                "MY",
                "Malásia",
                "—"
              ],
              [
                "MV",
                "Maldivas",
                "—"
              ],
              [
                "MT",
                "Malta",
                "—"
              ],
              [
                "MH",
                "Ilhas Marshall",
                "—"
              ],
              [
                "MQ",
                "Martinica",
                "—"
              ],
              [
                "MR",
                "Mauritânia",
                "—"
              ],
              [
                "MU",
                "Maurício",
                "—"
              ],
              [
                "YT",
                "Mayotte",
                "—"
              ],
              [
                "MX",
                "México",
                "—"
              ],
              [
                "MD",
                "Moldávia",
                "—"
              ],
              [
                "MC",
                "Mônaco",
                "—"
              ],
              [
                "MN",
                "Mongólia",
                "—"
              ],
              [
                "ME",
                "Montenegro",
                "—"
              ],
              [
                "MS",
                "Montserrat",
                "—"
              ],
              [
                "MA",
                "Marrocos",
                "—"
              ],
              [
                "MZ",
                "Moçambique",
                "—"
              ],
              [
                "NA",
                "Namíbia",
                "—"
              ],
              [
                "NR",
                "Nauru",
                "—"
              ],
              [
                "NP",
                "Nepal",
                "—"
              ],
              [
                "NL",
                "Países Baixos",
                "—"
              ],
              [
                "NC",
                "Nova Caledônia",
                "—"
              ],
              [
                "NZ",
                "Nova Zelândia",
                "—"
              ],
              [
                "NE",
                "Níger",
                "—"
              ],
              [
                "NG",
                "Nigéria",
                "—"
              ],
              [
                "NU",
                "Niue",
                "—"
              ],
              [
                "NF",
                "Ilha Norfolk",
                "—"
              ],
              [
                "MK",
                "Macedônia do Norte",
                "—"
              ],
              [
                "MP",
                "Ilhas Marianas Setentrionais",
                "—"
              ],
              [
                "NO",
                "Noruega",
                "—"
              ],
              [
                "OM",
                "Omã",
                "—"
              ],
              [
                "PK",
                "Paquistão",
                "—"
              ],
              [
                "PW",
                "Palau",
                "—"
              ],
              [
                "PA",
                "Panamá",
                "—"
              ],
              [
                "PG",
                "Papua-Nova Guiné",
                "—"
              ],
              [
                "PY",
                "Paraguai",
                "—"
              ],
              [
                "PE",
                "Peru",
                "—"
              ],
              [
                "PH",
                "Filipinas",
                "—"
              ],
              [
                "PN",
                "Ilhas Pitcairn",
                "—"
              ],
              [
                "PL",
                "Polônia",
                "—"
              ],
              [
                "PT",
                "Portugal",
                "—"
              ],
              [
                "PR",
                "Porto Rico",
                "—"
              ],
              [
                "QA",
                "Qatar",
                "—"
              ],
              [
                "RO",
                "Romênia",
                "—"
              ],
              [
                "RW",
                "Ruanda",
                "—"
              ],
              [
                "RE",
                "Reunião",
                "—"
              ],
              [
                "BL",
                "St. Barthélemy",
                "—"
              ],
              [
                "SH",
                "Santa Helena",
                "—"
              ],
              [
                "KN",
                "São Cristóvão e Nevis",
                "—"
              ],
              [
                "LC",
                "Santa Lúcia",
                "—"
              ],
              [
                "MF",
                "São Martinho",
                "—"
              ],
              [
                "PM",
                "São Pedro e Miquelon",
                "—"
              ],
              [
                "VC",
                "São Vicente e Granadinas",
                "—"
              ],
              [
                "WS",
                "Samoa",
                "—"
              ],
              [
                "SM",
                "San Marino",
                "—"
              ],
              [
                "ST",
                "São Tomé e Príncipe",
                "—"
              ],
              [
                "SA",
                "Arábia Saudita",
                "—"
              ],
              [
                "SN",
                "Senegal",
                "—"
              ],
              [
                "RS",
                "Sérvia",
                "—"
              ],
              [
                "SC",
                "Seicheles",
                "—"
              ],
              [
                "SL",
                "Serra Leoa",
                "—"
              ],
              [
                "SG",
                "Singapura",
                "—"
              ],
              [
                "SX",
                "Sint Maarten",
                "—"
              ],
              [
                "SK",
                "Eslováquia",
                "—"
              ],
              [
                "SI",
                "Eslovênia",
                "—"
              ],
              [
                "SB",
                "Ilhas Salomão",
                "—"
              ],
              [
                "ZA",
                "África do Sul",
                "—"
              ],
              [
                "GS",
                "Geórgia do Sul e Ilhas Sandwich do Sul",
                "—"
              ],
              [
                "KR",
                "Coreia do Sul",
                "—"
              ],
              [
                "ES",
                "Espanha",
                "—"
              ],
              [
                "LK",
                "Sri Lanka",
                "—"
              ],
              [
                "PS",
                "Territórios Palestinos",
                "—"
              ],
              [
                "SR",
                "Suriname",
                "—"
              ],
              [
                "SJ",
                "Svalbard e Jan Mayen",
                "—"
              ],
              [
                "SE",
                "Suécia",
                "—"
              ],
              [
                "CH",
                "Suíça",
                "—"
              ],
              [
                "TW",
                "Taiwan",
                "—"
              ],
              [
                "TJ",
                "Tadjiquistão",
                "—"
              ],
              [
                "TZ",
                "Tanzânia",
                "—"
              ],
              [
                "TH",
                "Tailândia",
                "—"
              ],
              [
                "TL",
                "Timor-Leste",
                "—"
              ],
              [
                "TG",
                "Togo",
                "—"
              ],
              [
                "TK",
                "Tokelau",
                "—"
              ],
              [
                "TO",
                "Tonga",
                "—"
              ],
              [
                "TT",
                "Trinidad e Tobago",
                "—"
              ],
              [
                "TN",
                "Tunísia",
                "—"
              ],
              [
                "TM",
                "Turcomenistão",
                "—"
              ],
              [
                "TC",
                "Ilhas Turcas e Caicos",
                "—"
              ],
              [
                "TV",
                "Tuvalu",
                "—"
              ],
              [
                "TR",
                "Türkiye",
                "—"
              ],
              [
                "UG",
                "Uganda",
                "—"
              ],
              [
                "UA",
                "Ucrânia**",
                "Os cartões não estão disponíveis na Crimeia, Donetsk, Luhansk, Kherson e Zaporizhzhia. O restante da Ucrânia está disponível."
              ],
              [
                "AE",
                "Emirados Árabes Unidos",
                "—"
              ],
              [
                "GB",
                "Reino Unido",
                "—"
              ],
              [
                "UM",
                "Ilhas Menores Distantes dos EUA",
                "—"
              ],
              [
                "US",
                "Estados Unidos",
                "—"
              ],
              [
                "UY",
                "Uruguai",
                "—"
              ],
              [
                "UZ",
                "Uzbequistão",
                "—"
              ],
              [
                "VU",
                "Vanuatu",
                "—"
              ],
              [
                "VN",
                "Vietnã",
                "—"
              ],
              [
                "VG",
                "Ilhas Virgens Britânicas",
                "—"
              ],
              [
                "VI",
                "Ilhas Virgens dos EUA",
                "—"
              ],
              [
                "WF",
                "Wallis e Futuna",
                "—"
              ],
              [
                "EH",
                "Saara Ocidental",
                "—"
              ],
              [
                "ZM",
                "Zâmbia",
                "—"
              ]
            ]
          },
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "crypto",
          "title": "Moedas e redes de pagamento",
          "paragraphs": [
            "O catálogo contém 16 moedas e 31 pares de moeda/rede. Uma moeda pode ser aceita em várias redes: USDT na Tron e USDT na Ethereum são opções de transferência diferentes. A lista completa aparece abaixo.",
            "As opções disponíveis para uma fatura específica e seus limites vêm de GET /api/checkout/{token}/crypto-services. Esta página descreve combinações suportadas; a resposta atual do gateway determina se um pagamento pode ser criado. Uma entrada de referência sozinha não torna um par indisponível pagável.",
            "O comerciante cria uma fatura de criptomoeda em USDT, e o cliente escolhe uma moeda e uma rede disponíveis. A operação criada do gateway fornece o valor exato da moeda, o endereço, o código QR e a validade. O preço de uma fatura em USDT não trava a taxa de câmbio de BTC, ETH ou outra moeda, nem implica uma taxa de 1:1. Transfira o valor decimal exato nas instruções de pagamento sem arredondar ou calcular uma conversão você mesmo.",
            "USDT TRC20 é um termo separado de pagamento ao comerciante. Ele não restringe pagamentos recebidos à Tron nem significa que a criação de pagamento está disponível pela conta ou API. O guia de pagamentos explica os termos e as restrições de saque."
          ],
          "bullets": [],
          "steps": [
            "Abra a fatura e escolha criptomoeda como método de pagamento.",
            "Escolha uma moeda e uma rede disponível. A rede da carteira do remetente deve corresponder à rede nas instruções de pagamento da Kevmi.",
            "Crie as instruções de pagamento e verifique o valor exato, o endereço completo e a validade. Copie o endereço e o valor, ou use o código QR apropriado.",
            "Envie o valor especificado na rede selecionada. Considere as taxas da carteira ou da rede para que o destinatário receba o valor total mostrado nas instruções.",
            "Aguarde um status confirmado no checkout. Enviar uma transferência de carteira sozinho não conclui o pedido: a Kevmi verifica o resultado por meio do gateway."
          ],
          "table": {
            "headers": [
              "Moeda",
              "Nome",
              "Redes e códigos de gateway"
            ],
            "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": "Não use instruções de pagamento antigas após a validade. Se você já enviou fundos, verifique a mesma operação e entre em contato com o suporte, se necessário; não crie um segundo pagamento para verificar o primeiro.",
          "links": [
            {
              "label": "Checkout",
              "href": "/docs/checkout#method"
            },
            {
              "label": "Termos de pagamento",
              "href": "/docs/payouts"
            }
          ]
        },
        {
          "id": "specific",
          "title": "Verificando um país específico",
          "paragraphs": [
            "O assistente pode encontrar um país pelo nome em russo ou inglês ou pelo código ISO e explicar seu marcador publicado. Para países **, especifique o local necessário. Para China *, pergunte sobre o seu cartão.",
            "Se um país estiver ausente da lista, esta base de conhecimento não pode confirmar a cobertura internacional de cartões. Inclua o país, o banco e o método desejado em uma solicitação de suporte. Não envie número completo de cartão ou segredos de pagamento."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Geografia",
              "href": "/countries"
            },
            {
              "label": "Peça suporte",
              "href": "/?support=open"
            }
          ]
        }
      ],
      "body": "Cobertura por canal\n\nCanal · Cobertura · Condições\nCartões internacionais · Mais de 190 países · Exceto a lista de restrições e cinco regiões da Ucrânia\nSBP · Rússia · A disponibilidade depende do banco e da transação\nAlipay · China · A disponibilidade depende da conta e da transação\nCriptomoeda · Todos os países · Escolha uma moeda suportada e uma rede\n\nO mapa interativo\n\nA página Geografia tem um mapa-múndi bidimensional. Os filtros destacam os países internacionais de cartão publicados, a Rússia para SBP e a China para Alipay. Pesquise por nome do país ou código ISO para ver seus métodos e notas.\n\nO hachurado marca a Ucrânia porque cinco regiões estão excluídas dos cartões. O restante da Ucrânia está disponível. As restrições de cartão não se aplicam a criptomoedas, que estão disponíveis em todos os países.\n\nAbrir o mapa\n\nO que a lista cobre\n\nA lista completa abaixo descreve a cobertura internacional de cartões. Os países de registro do comerciante e os destinos de pagamento têm condições separadas.\n\nA aprovação depende do país emissor, do banco, do tipo de cartão e das verificações do canal de pagamento. Um país estar na lista não garante aprovação para cada cartão ou transação.\n\nRestrições de Visa e Mastercard\n\nOs cartões não estão disponíveis na Crimeia, Donetsk, Luhansk, Kherson e Zaporizhzhia. O restante da Ucrânia está disponível.\n\nTodos os outros países estão disponíveis. Antilhas Neerlandesas é preservada como uma entrada histórica da lista do provedor; ela não bloqueia qualquer território caribenho moderno.\n\nCódigo · País ou território\nAF · Afeganistão\nAQ · Antártida\nBY · Bielorrússia\nMM · Birmânia (Mianmar)\nBI · Burundi\nCF · República Centro-Africana\nTD · Chade\nCU · Cuba\nCD · República Democrática do Congo\nCG · República do Congo\nER · Eritreia\nHT · Haiti\nIR · Irã\nIQ · Iraque\nLY · Líbia\nML · Mali\nNI · Nicarágua\nKP · Coreia do Norte\nRU · Rússia\nSO · Somália\nSS · Sudão do Sul\nSD · Sudão\nSY · Síria\nVE · Venezuela\nYE · Iêmen\nZW · Zimbábue\nUA-43 · Crimeia (Região da Ucrânia)\nUA-14 · Donetsk (Região da Ucrânia)\nUA-65 · Kherson (Região da Ucrânia)\nUA-09 · Luhansk (Região da Ucrânia)\nUA-23 · Zaporizhzhia (Região da Ucrânia)\nAN · Antilhas Neerlandesas\n\nDiretório de países e territórios\n\nNomes, códigos ISO e marcadores vêm do registro compartilhado de países. Essas notas se aplicam a cartões internacionais.\n\nISO · País ou território · Nota\nAX · Ilhas Åland · —\nAL · Albânia · —\nDZ · Argélia · —\nAS · Samoa Americana · —\nAD · Andorra · —\nAO · Angola · —\nAI · Anguila · —\nAG · Antígua e Barbuda · —\nAR · Argentina · —\nAM · Armênia · —\nAW · Aruba · —\nAU · Austrália · —\nAT · Áustria · —\nAZ · Azerbaijão · —\nBS · Bahamas · —\nBH · Bahrein · —\nBD · Bangladesh · —\nBB · Barbados · —\nBE · Bélgica · —\nBZ · Belize · —\nBJ · Benim · —\nBM · Bermudas · —\nBT · Butão · —\nBO · Bolívia · —\nBQ · Países Baixos Caribenhos · —\nBA · Bósnia e Herzegovina · —\nBW · Botsuana · —\nBV · Ilha Bouvet · —\nBR · Brasil · —\nIO · Território Britânico do Oceano Índico · —\nBN · Brunei · —\nBG · Bulgária · —\nBF · Burkina Faso · —\nCV · Cabo Verde · —\nKH · Camboja · —\nCM · Camarões · —\nCA · Canadá · —\nKY · Ilhas Cayman · —\nCL · Chile · —\nCN · China · —\nCX · Ilha Christmas · —\nCC · Ilhas Cocos (Keeling) · —\nCO · Colômbia · —\nKM · Comores · —\nCK · Ilhas Cook · —\nCR · Costa Rica · —\nHR · Croácia · —\nCW · Curaçau · —\nCY · Chipre · —\nCZ · Chéquia · —\nCI · Costa do Marfim · —\nDK · Dinamarca · —\nDJ · Djibouti · —\nDM · Dominica · —\nDO · República Dominicana · —\nEC · Equador · —\nEG · Egito · —\nSV · El Salvador · —\nGQ · Guiné Equatorial · —\nEE · Estónia · —\nSZ · Essuatíni · —\nET · Etiópia · —\nFK · Ilhas Falkland · —\nFO · Ilhas Faroé · —\nFM · Micronésia · —\nFJ · Fiji · —\nFI · Finlândia · —\nFR · França · —\nGF · Guiana Francesa · —\nPF · Polinésia Francesa · —\nTF · Territórios Franceses do Sul · —\nGA · Gabão · —\nGM · Gâmbia · —\nGE · Geórgia · —\nDE · Alemanha · —\nGH · Gana · —\nGI · Gibraltar · —\nGR · Grécia · —\nGL · Groenlândia · —\nGD · Granada · —\nGP · Guadalupe · —\nGU · Guam · —\nGT · Guatemala · —\nGG · Guernsey · —\nGN · Guiné · —\nGW · Guiné-Bissau · —\nGY · Guiana · —\nHM · Ilhas Heard e McDonald · —\nVA · Cidade do Vaticano · —\nHN · Honduras · —\nHK · Região Administrativa Especial de Hong Kong, China · —\nHU · Hungria · —\nIS · Islândia · —\nIN · Índia · —\nID · Indonésia · —\nIE · Irlanda · —\nIM · Ilha de Man · —\nIL · Israel · —\nIT · Itália · —\nJM · Jamaica · —\nJP · Japão · —\nJE · Jersey · —\nJO · Jordânia · —\nKZ · Cazaquistão · —\nKE · Quénia · —\nKI · Quiribati · —\nKW · Kuwait · —\nKG · Quirguistão · —\nLA · Laos · —\nLV · Letônia · —\nLB · Líbano · —\nLS · Lesoto · —\nLR · Libéria · —\nLI · Liechtenstein · —\nLT · Lituânia · —\nLU · Luxemburgo · —\nMO · Macau RAEC China · —\nMG · Madagascar · —\nMW · Malaui · —\nMY · Malásia · —\nMV · Maldivas · —\nMT · Malta · —\nMH · Ilhas Marshall · —\nMQ · Martinica · —\nMR · Mauritânia · —\nMU · Maurício · —\nYT · Mayotte · —\nMX · México · —\nMD · Moldávia · —\nMC · Mônaco · —\nMN · Mongólia · —\nME · Montenegro · —\nMS · Montserrat · —\nMA · Marrocos · —\nMZ · Moçambique · —\nNA · Namíbia · —\nNR · Nauru · —\nNP · Nepal · —\nNL · Países Baixos · —\nNC · Nova Caledônia · —\nNZ · Nova Zelândia · —\nNE · Níger · —\nNG · Nigéria · —\nNU · Niue · —\nNF · Ilha Norfolk · —\nMK · Macedônia do Norte · —\nMP · Ilhas Marianas Setentrionais · —\nNO · Noruega · —\nOM · Omã · —\nPK · Paquistão · —\nPW · Palau · —\nPA · Panamá · —\nPG · Papua-Nova Guiné · —\nPY · Paraguai · —\nPE · Peru · —\nPH · Filipinas · —\nPN · Ilhas Pitcairn · —\nPL · Polônia · —\nPT · Portugal · —\nPR · Porto Rico · —\nQA · Qatar · —\nRO · Romênia · —\nRW · Ruanda · —\nRE · Reunião · —\nBL · St. Barthélemy · —\nSH · Santa Helena · —\nKN · São Cristóvão e Nevis · —\nLC · Santa Lúcia · —\nMF · São Martinho · —\nPM · São Pedro e Miquelon · —\nVC · São Vicente e Granadinas · —\nWS · Samoa · —\nSM · San Marino · —\nST · São Tomé e Príncipe · —\nSA · Arábia Saudita · —\nSN · Senegal · —\nRS · Sérvia · —\nSC · Seicheles · —\nSL · Serra Leoa · —\nSG · Singapura · —\nSX · Sint Maarten · —\nSK · Eslováquia · —\nSI · Eslovênia · —\nSB · Ilhas Salomão · —\nZA · África do Sul · —\nGS · Geórgia do Sul e Ilhas Sandwich do Sul · —\nKR · Coreia do Sul · —\nES · Espanha · —\nLK · Sri Lanka · —\nPS · Territórios Palestinos · —\nSR · Suriname · —\nSJ · Svalbard e Jan Mayen · —\nSE · Suécia · —\nCH · Suíça · —\nTW · Taiwan · —\nTJ · Tadjiquistão · —\nTZ · Tanzânia · —\nTH · Tailândia · —\nTL · Timor-Leste · —\nTG · Togo · —\nTK · Tokelau · —\nTO · Tonga · —\nTT · Trinidad e Tobago · —\nTN · Tunísia · —\nTM · Turcomenistão · —\nTC · Ilhas Turcas e Caicos · —\nTV · Tuvalu · —\nTR · Türkiye · —\nUG · Uganda · —\nUA · Ucrânia** · Os cartões não estão disponíveis na Crimeia, Donetsk, Luhansk, Kherson e Zaporizhzhia. O restante da Ucrânia está disponível.\nAE · Emirados Árabes Unidos · —\nGB · Reino Unido · —\nUM · Ilhas Menores Distantes dos EUA · —\nUS · Estados Unidos · —\nUY · Uruguai · —\nUZ · Uzbequistão · —\nVU · Vanuatu · —\nVN · Vietnã · —\nVG · Ilhas Virgens Britânicas · —\nVI · Ilhas Virgens dos EUA · —\nWF · Wallis e Futuna · —\nEH · Saara Ocidental · —\nZM · Zâmbia · —\n\nMoedas e redes de pagamento\n\nO catálogo contém 16 moedas e 31 pares de moeda/rede. Uma moeda pode ser aceita em várias redes: USDT na Tron e USDT na Ethereum são opções de transferência diferentes. A lista completa aparece abaixo.\n\nAs opções disponíveis para uma fatura específica e seus limites vêm de GET /api/checkout/{token}/crypto-services. Esta página descreve combinações suportadas; a resposta atual do gateway determina se um pagamento pode ser criado. Uma entrada de referência sozinha não torna um par indisponível pagável.\n\nO comerciante cria uma fatura de criptomoeda em USDT, e o cliente escolhe uma moeda e uma rede disponíveis. A operação criada do gateway fornece o valor exato da moeda, o endereço, o código QR e a validade. O preço de uma fatura em USDT não trava a taxa de câmbio de BTC, ETH ou outra moeda, nem implica uma taxa de 1:1. Transfira o valor decimal exato nas instruções de pagamento sem arredondar ou calcular uma conversão você mesmo.\n\nUSDT TRC20 é um termo separado de pagamento ao comerciante. Ele não restringe pagamentos recebidos à Tron nem significa que a criação de pagamento está disponível pela conta ou API. O guia de pagamentos explica os termos e as restrições de saque.\n\nAbra a fatura e escolha criptomoeda como método de pagamento.\n\nEscolha uma moeda e uma rede disponível. A rede da carteira do remetente deve corresponder à rede nas instruções de pagamento da Kevmi.\n\nCrie as instruções de pagamento e verifique o valor exato, o endereço completo e a validade. Copie o endereço e o valor, ou use o código QR apropriado.\n\nEnvie o valor especificado na rede selecionada. Considere as taxas da carteira ou da rede para que o destinatário receba o valor total mostrado nas instruções.\n\nAguarde um status confirmado no checkout. Enviar uma transferência de carteira sozinho não conclui o pedido: a Kevmi verifica o resultado por meio do gateway.\n\nMoeda · Nome · Redes e códigos de gateway\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\nNão use instruções de pagamento antigas após a validade. Se você já enviou fundos, verifique a mesma operação e entre em contato com o suporte, se necessário; não crie um segundo pagamento para verificar o primeiro.\n\nCheckout\n\nTermos de pagamento\n\nVerificando um país específico\n\nO assistente pode encontrar um país pelo nome em russo ou inglês ou pelo código ISO e explicar seu marcador publicado. Para países **, especifique o local necessário. Para China *, pergunte sobre o seu cartão.\n\nSe um país estiver ausente da lista, esta base de conhecimento não pode confirmar a cobertura internacional de cartões. Inclua o país, o banco e o método desejado em uma solicitação de suporte. Não envie número completo de cartão ou segredos de pagamento.\n\nGeografia\n\nPeça suporte",
      "readMinutes": 15
    },
    {
      "id": "payment-links",
      "title": "Links de pagamento",
      "summary": "Um link de pagamento abre uma página de pedido dedicada. Os clientes veem o vendedor, a descrição da compra, os métodos disponíveis e o total devido no celular ou computador.",
      "group": "payments",
      "url": "/docs/payment-links",
      "tags": [
        "link de pagamento",
        "fatura",
        "checkout",
        "pausa",
        "pedido",
        "Qualquer",
        "seleção de método"
      ],
      "sections": [
        {
          "id": "contents",
          "title": "O que uma fatura inclui",
          "paragraphs": [
            "As faturas do novo workspace usam um preço base em USD e o plano Any oferece todos os quatro métodos. O SBP converte para RUB à taxa de referência congelada do Banco da Rússia; cripto usa a regra explícita de fatura 1:1 USD/USDT. O preço nativo legado permanece disponível para faturas antigas e solicitações de API sem pricingMode=universal. Consulte a seção de múltiplas lojas e preço em USD abaixo.",
            "Nunca inclua senhas, chaves de API, dados de cartão ou códigos bancários em descrições públicas. Use um título de pedido e uma referência que o cliente reconheça."
          ],
          "bullets": [
            "Nome da loja, um título de pedido de até 120 caracteres e uma descrição de até 500 caracteres.",
            "Valor base e uma moeda explícita USD, RUB ou USDT.",
            "Métodos compatíveis, taxas separadas e parcelas de IVA, uma referência de pedido e validade do link.",
            "As respostas do proprietário incluem link.payment com o estado salvo de uma operação existente; isso é separado do estado de disponibilidade do link."
          ],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "any",
          "title": "Qualquer — o cliente escolhe",
          "paragraphs": [
            "Any includes card, alipay, sbp and crypto in universal USD pricing. Pass pricingMode=universal and a concrete methods array. Currency-specific native pricing remains available for compatibility.",
            "As faturas do novo workspace usam um preço base em USD e o plano Any oferece todos os quatro métodos. O SBP converte para RUB à taxa de referência congelada do Banco da Rússia; cripto usa a regra explícita de fatura 1:1 USD/USDT. O preço nativo legado permanece disponível para faturas antigas e solicitações de API sem pricingMode=universal. Consulte a seção de múltiplas lojas e preço em USD abaixo.",
            "Para um novo pagamento ao vivo com cartão ou Alipay, o gateway atual suporta apenas feeCustomerPercent=0 e vatCustomerPercent=100: o comerciante cobre toda a taxa de processamento e o IVA é adicionado integralmente para o cliente. Outras parcelas podem ser salvas e calculadas em uma fatura, mas a execução é bloqueada com unsupported_allocation. O servidor nunca altera silenciosamente os termos salvos. Pagamentos SBP e USDT cripto suportam todas as parcelas de taxa de processamento e não têm IVA."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Enviar métodos pela API",
              "href": "/docs/payment-links-api#methods"
            }
          ]
        },
        {
          "id": "create",
          "title": "Criar um link",
          "paragraphs": [],
          "bullets": [],
          "steps": [
            "Abra Payment links na sua conta.",
            "Insira um título, valor, moeda e descrição. Defina as parcelas de taxa e IVA com os dois controles.",
            "Mantenha Qualquer para deixar o cliente escolher, ou selecione métodos específicos. Defina a expiração.",
            "Compare o total de cada método e visualize o checkout.",
            "Receba o link de checkout pronto imediatamente após a criação e copie-o para o seu cliente ou widget."
          ],
          "table": null,
          "code": null,
          "note": "Se a aceitação de pagamento estiver indisponível, o checkout relata isso antes da confirmação. Criar uma fatura não cobra dinheiro.",
          "links": []
        },
        {
          "id": "fixed",
          "title": "Os termos permanecem com a fatura",
          "paragraphs": [
            "Uma fatura salva não muda quando as configurações da loja mudam. Seu preço, moeda, parcelas de taxa e IVA, referência do pedido e metadados pertencem a esse pedido. Isso mantém o total consistente para um cliente que já abriu o link.",
            "Crie um novo link e pause o antigo quando o preço, descrição ou alocação de custos mudar. Editar o valor de uma URL não pode alterar o cálculo do servidor."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "public",
          "title": "Uma página de checkout dedicada",
          "paragraphs": [
            "Os links do servidor são salvos no banco de dados e abrem em vários dispositivos em /pay/… sem acesso à conta do comerciante. Um cliente não precisa se registrar para ver uma fatura. Saldos da loja, configurações e outros registros do cliente permanecem privados.",
            "O exemplo /pay/demo visualiza a experiência sem cobrar dinheiro. Links de demonstração no navegador são dados de teste e não devem ser apresentados como faturas reais."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Pré-visualizar checkout",
              "href": "/pay/demo"
            },
            {
              "label": "Estados do checkout",
              "href": "/docs/checkout"
            }
          ]
        },
        {
          "id": "control",
          "title": "Gerenciando disponibilidade",
          "paragraphs": [
            "Pausar, cancelar ou expirar um link bloqueia uma nova operação. Isso não oculta um pagamento já enviado: status, conciliação e um código bancário solicitado permanecem disponíveis. Disponibilidade do link e estado financeiro são verificados separadamente.",
            "Retomar remove uma pausa sem alterar os termos. Cancelamento é definitivo, e um link expirado não pode ser estendido. Crie uma nova fatura para um novo pedido ou termos alterados, não para tentar novamente uma cobrança cujo resultado é desconhecido."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "stores-usd",
          "title": "Múltiplas lojas e um preço base em USD",
          "paragraphs": [
            "Escolha Todas as lojas para análises e operações agregadas, ou selecione uma loja para seus próprios registros. Cada loja tem um storeId separado, nome, padrão de IVA, faturas, chaves de API, endpoints de webhook, histórico de eventos e aplicativo de site. Notificações e tickets de suporte pertencem à conta. Uma conta pode criar até 100 lojas. Registros existentes permanecem na primeira loja.",
            "As faturas do novo workspace usam pricingMode=\"universal\" e um preço base em USD. O plano Any inclui cartão, alipay, sbp e cripto; um comerciante pode selecionar um subconjunto. Cartões e Alipay cobram em USD. O SBP cobra em RUB usando a taxa de referência USD/RUB do Banco da Rússia. Cripto cobra USDT sob a regra explícita de fatura 1 USD = 1 USDT. Esta é uma regra de conversão de fatura, não uma cotação de mercado de USDT. O gateway fornece a taxa da moeda selecionada, o valor exato da transferência e instruções antes da transferência.",
            "A taxa de referência e ambos os valores são congelados na criação. Faturas que envolvem conversão RUB expiram dentro de 24 horas. Se a taxa de referência não puder ser obtida, a criação falha com FX_UNAVAILABLE; nenhuma taxa de fallback inventada ou desatualizada é usada. O valor do proprietário em minor e cotações usam a moeda contábil USD. quotes[method].settlement contém a cotação de cobrança nativa. O checkout público expõe a moeda de cobrança selecionada em currency, o preço original em baseAmountMinor/baseCurrency, e a taxa de referência em fx. Uma vez que um pagamento foi enviado, seu método não pode ser alterado; uma fatura tem uma operação de gateway.",
            "Crie uma chave de API dentro da loja pretendida e envie Authorization: Bearer <key> do seu servidor. Seu vínculo de loja é imutável; X-Kevmi-Store não pode conceder acesso a outra loja. Sessões de navegador selecionam X-Kevmi-Store: <storeId>; omitir seleciona a primeira loja. O valor all é aceito apenas por GET /api/account/dashboard e GET /api/payment-links. Mutações exigem uma loja selecionada, Origin e X-CSRF-Token. IDs de conta e IDs de loja são identificadores diferentes.",
            "Para compatibilidade, solicitações de API sem pricingMode=\"universal\" mantêm preço nativo e as restrições originais de moeda. Faturas existentes nunca são recalculadas. Recibos confirmados nas análises refletem pagamentos verificados menos despesas de fatura salvas; eles não são um saldo sacável. Moedas de fatura legadas permanecem separadas e pagamentos são combinados com o suporte. Cumpra um pedido somente após verificar payment.fulfillmentReady=true e payment.status=\"succeeded\" através da API do servidor, histórico de eventos ou um webhook assinado."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        }
      ],
      "body": "O que uma fatura inclui\n\nAs faturas do novo workspace usam um preço base em USD e o plano Any oferece todos os quatro métodos. O SBP converte para RUB à taxa de referência congelada do Banco da Rússia; cripto usa a regra explícita de fatura 1:1 USD/USDT. O preço nativo legado permanece disponível para faturas antigas e solicitações de API sem pricingMode=universal. Consulte a seção de múltiplas lojas e preço em USD abaixo.\n\nNunca inclua senhas, chaves de API, dados de cartão ou códigos bancários em descrições públicas. Use um título de pedido e uma referência que o cliente reconheça.\n\nNome da loja, um título de pedido de até 120 caracteres e uma descrição de até 500 caracteres.\n\nValor base e uma moeda explícita USD, RUB ou USDT.\n\nMétodos compatíveis, taxas separadas e parcelas de IVA, uma referência de pedido e validade do link.\n\nAs respostas do proprietário incluem link.payment com o estado salvo de uma operação existente; isso é separado do estado de disponibilidade do link.\n\nQualquer — o cliente escolhe\n\nAny includes card, alipay, sbp and crypto in universal USD pricing. Pass pricingMode=universal and a concrete methods array. Currency-specific native pricing remains available for compatibility.\n\nAs faturas do novo workspace usam um preço base em USD e o plano Any oferece todos os quatro métodos. O SBP converte para RUB à taxa de referência congelada do Banco da Rússia; cripto usa a regra explícita de fatura 1:1 USD/USDT. O preço nativo legado permanece disponível para faturas antigas e solicitações de API sem pricingMode=universal. Consulte a seção de múltiplas lojas e preço em USD abaixo.\n\nPara um novo pagamento ao vivo com cartão ou Alipay, o gateway atual suporta apenas feeCustomerPercent=0 e vatCustomerPercent=100: o comerciante cobre toda a taxa de processamento e o IVA é adicionado integralmente para o cliente. Outras parcelas podem ser salvas e calculadas em uma fatura, mas a execução é bloqueada com unsupported_allocation. O servidor nunca altera silenciosamente os termos salvos. Pagamentos SBP e USDT cripto suportam todas as parcelas de taxa de processamento e não têm IVA.\n\nEnviar métodos pela API\n\nCriar um link\n\nAbra Payment links na sua conta.\n\nInsira um título, valor, moeda e descrição. Defina as parcelas de taxa e IVA com os dois controles.\n\nMantenha Qualquer para deixar o cliente escolher, ou selecione métodos específicos. Defina a expiração.\n\nCompare o total de cada método e visualize o checkout.\n\nReceba o link de checkout pronto imediatamente após a criação e copie-o para o seu cliente ou widget.\n\nSe a aceitação de pagamento estiver indisponível, o checkout relata isso antes da confirmação. Criar uma fatura não cobra dinheiro.\n\nOs termos permanecem com a fatura\n\nUma fatura salva não muda quando as configurações da loja mudam. Seu preço, moeda, parcelas de taxa e IVA, referência do pedido e metadados pertencem a esse pedido. Isso mantém o total consistente para um cliente que já abriu o link.\n\nCrie um novo link e pause o antigo quando o preço, descrição ou alocação de custos mudar. Editar o valor de uma URL não pode alterar o cálculo do servidor.\n\nUma página de checkout dedicada\n\nOs links do servidor são salvos no banco de dados e abrem em vários dispositivos em /pay/… sem acesso à conta do comerciante. Um cliente não precisa se registrar para ver uma fatura. Saldos da loja, configurações e outros registros do cliente permanecem privados.\n\nO exemplo /pay/demo visualiza a experiência sem cobrar dinheiro. Links de demonstração no navegador são dados de teste e não devem ser apresentados como faturas reais.\n\nPré-visualizar checkout\n\nEstados do checkout\n\nGerenciando disponibilidade\n\nPausar, cancelar ou expirar um link bloqueia uma nova operação. Isso não oculta um pagamento já enviado: status, conciliação e um código bancário solicitado permanecem disponíveis. Disponibilidade do link e estado financeiro são verificados separadamente.\n\nRetomar remove uma pausa sem alterar os termos. Cancelamento é definitivo, e um link expirado não pode ser estendido. Crie uma nova fatura para um novo pedido ou termos alterados, não para tentar novamente uma cobrança cujo resultado é desconhecido.\n\nMúltiplas lojas e um preço base em USD\n\nEscolha Todas as lojas para análises e operações agregadas, ou selecione uma loja para seus próprios registros. Cada loja tem um storeId separado, nome, padrão de IVA, faturas, chaves de API, endpoints de webhook, histórico de eventos e aplicativo de site. Notificações e tickets de suporte pertencem à conta. Uma conta pode criar até 100 lojas. Registros existentes permanecem na primeira loja.\n\nAs faturas do novo workspace usam pricingMode=\"universal\" e um preço base em USD. O plano Any inclui cartão, alipay, sbp e cripto; um comerciante pode selecionar um subconjunto. Cartões e Alipay cobram em USD. O SBP cobra em RUB usando a taxa de referência USD/RUB do Banco da Rússia. Cripto cobra USDT sob a regra explícita de fatura 1 USD = 1 USDT. Esta é uma regra de conversão de fatura, não uma cotação de mercado de USDT. O gateway fornece a taxa da moeda selecionada, o valor exato da transferência e instruções antes da transferência.\n\nA taxa de referência e ambos os valores são congelados na criação. Faturas que envolvem conversão RUB expiram dentro de 24 horas. Se a taxa de referência não puder ser obtida, a criação falha com FX_UNAVAILABLE; nenhuma taxa de fallback inventada ou desatualizada é usada. O valor do proprietário em minor e cotações usam a moeda contábil USD. quotes[method].settlement contém a cotação de cobrança nativa. O checkout público expõe a moeda de cobrança selecionada em currency, o preço original em baseAmountMinor/baseCurrency, e a taxa de referência em fx. Uma vez que um pagamento foi enviado, seu método não pode ser alterado; uma fatura tem uma operação de gateway.\n\nCrie uma chave de API dentro da loja pretendida e envie Authorization: Bearer <key> do seu servidor. Seu vínculo de loja é imutável; X-Kevmi-Store não pode conceder acesso a outra loja. Sessões de navegador selecionam X-Kevmi-Store: <storeId>; omitir seleciona a primeira loja. O valor all é aceito apenas por GET /api/account/dashboard e GET /api/payment-links. Mutações exigem uma loja selecionada, Origin e X-CSRF-Token. IDs de conta e IDs de loja são identificadores diferentes.\n\nPara compatibilidade, solicitações de API sem pricingMode=\"universal\" mantêm preço nativo e as restrições originais de moeda. Faturas existentes nunca são recalculadas. Recibos confirmados nas análises refletem pagamentos verificados menos despesas de fatura salvas; eles não são um saldo sacável. Moedas de fatura legadas permanecem separadas e pagamentos são combinados com o suporte. Cumpra um pedido somente após verificar payment.fulfillmentReady=true e payment.status=\"succeeded\" através da API do servidor, histórico de eventos ou um webhook assinado.",
      "readMinutes": 5
    },
    {
      "id": "checkout",
      "title": "Checkout",
      "summary": "O checkout mostra ao cliente o que ele está comprando, como pode pagar e o valor devido antes da confirmação. Ele é separado do espaço de trabalho do comerciante.",
      "group": "payments",
      "url": "/docs/checkout",
      "tags": [
        "checkout",
        "cliente",
        "pagar",
        "fatura",
        "erro de pagamento"
      ],
      "sections": [
        {
          "id": "review",
          "title": "Revise o pedido",
          "paragraphs": [
            "Verifique o nome da loja, compra, preço base e moeda. Se diferirem do seu acordo com o vendedor, peça uma fatura corrigida antes de continuar.",
            "Uma fatura pública exige apenas seu endereço; acesso à conta do vendedor não é necessário. Uma página de demonstração é claramente marcada e não coleta dados de cartão para uma cobrança real."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "method",
          "title": "Escolha um método",
          "paragraphs": [
            "As faturas do novo workspace usam um preço base em USD e o plano Any oferece todos os quatro métodos. O SBP converte para RUB à taxa de referência congelada do Banco da Rússia; cripto usa a regra explícita de fatura 1:1 USD/USDT. O preço nativo legado permanece disponível para faturas antigas e solicitações de API sem pricingMode=universal. Consulte a seção de múltiplas lojas e preço em USD abaixo.",
            "Cartão: o navegador criptografa os dados de pagamento com a chave pública do gateway. A Kevmi retransmite o envelope criptografado; seu servidor não aceita nem armazena números de cartão em texto plano, CVV ou códigos bancários de uso único. Um formulário de código bancário solicitado aparece apenas enquanto o desafio do gateway for válido.",
            "Alipay: o cliente fornece um nome e recebe um QR code. SBP abre a URL de pagamento bancário; um QR fornecido pelo gateway também pode ser usado. Uma expiração é exibida quando o gateway fornece uma.",
            "Cripto: escolha uma moeda e depois uma rede disponível do catálogo atual. Após criar uma operação, o checkout exibe o valor decimal exato, endereço do destinatário e dois modos de QR: apenas endereço, ou endereço e valor. A rede da carteira deve corresponder à rede escolhida. O preço de uma fatura USDT não trava a taxa de câmbio de outra moeda: use o valor fornecido pelo gateway. Instruções expiradas são ocultas enquanto a conciliação continua para o mesmo pagamento.",
            "Para um novo pagamento ao vivo com cartão ou Alipay, o gateway atual suporta apenas feeCustomerPercent=0 e vatCustomerPercent=100: o comerciante cobre toda a taxa de processamento e o IVA é adicionado integralmente para o cliente. Outras parcelas podem ser salvas e calculadas em uma fatura, mas a execução é bloqueada com unsupported_allocation. O servidor nunca altera silenciosamente os termos salvos. Pagamentos SBP e USDT cripto suportam todas as parcelas de taxa de processamento e não têm IVA."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "states",
          "title": "Estados do checkout",
          "paragraphs": [],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Estado",
              "Significado",
              "Próximo passo"
            ],
            "rows": [
              [
                "Ativo",
                "A fatura está disponível para visualização",
                "Verifique o total e a disponibilidade do método selecionado"
              ],
              [
                "Pausado / expirado / cancelado",
                "Nenhum novo pagamento pode iniciar pelo link",
                "Entre em contato com o vendedor; uma operação original é verificada separadamente"
              ],
              [
                "Não encontrado",
                "O endereço é inválido ou indisponível",
                "Verifique o endereço completo"
              ],
              [
                "Pagamento indisponível",
                "Uma nova operação é bloqueada por configuração, método, limite, alocação ou revisão do comerciante",
                "Siga a mensagem exibida; os termos da fatura salva não mudam"
              ],
              [
                "Pendente / ação necessária",
                "A operação original existe ou precisa de confirmação",
                "Conclua a etapa atual ou verifique seu status"
              ],
              [
                "Resultado sendo verificado",
                "Um resultado confirmado ainda não está disponível",
                "Verifique a operação original; não crie uma segunda cobrança"
              ]
            ]
          },
          "code": null,
          "note": "Um erro de rede ou resposta ausente não prova que nenhuma cobrança ocorreu. Uma operação já enviada permanece legível mesmo que o link não aceite mais novos pagamentos.",
          "links": []
        },
        {
          "id": "confirmation",
          "title": "O que confirma pagamento",
          "paragraphs": [
            "O pagamento é confirmado pela conciliação do servidor da operação exata do gateway. succeeded exige fulfillment_ready=true, verification=provider_confirmed, nenhuma disputa e correspondência exata entre o valor pago e o total aprovado. Cripto adicionalmente exige evidência de liquidação confirmada.",
            "Um redirecionamento, mensagem de widget, código bancário aceito ou observação do navegador não confirmam dinheiro. Após um timeout, leia o status da operação original; uma tentativa de substituição nunca é criada automaticamente.",
            "Um novo pagamento e uma intenção de cartão exigem que a solicitação mais recente de revisão do site do comerciante seja aprovada. A aprovação por si só não conecta o gateway de pagamento. Se a revisão mudar após o envio, a operação existente permanece disponível para leitura de status, conciliação e um código bancário solicitado."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "help",
          "title": "Obtendo ajuda",
          "paragraphs": [
            "Envie ao vendedor a referência ou endereço da fatura, o horário da tentativa e o erro exibido. Não envie CVV, senha bancária, código de confirmação ou frase-semente ao suporte. O assistente de documentação pode explicar termos, mas não pode confirmar um crédito de forma independente."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Ajuda de pagamento",
              "href": "/?support=open"
            },
            {
              "label": "Cálculo de IVA",
              "href": "/docs/vat"
            }
          ]
        }
      ],
      "body": "Revise o pedido\n\nVerifique o nome da loja, compra, preço base e moeda. Se diferirem do seu acordo com o vendedor, peça uma fatura corrigida antes de continuar.\n\nUma fatura pública exige apenas seu endereço; acesso à conta do vendedor não é necessário. Uma página de demonstração é claramente marcada e não coleta dados de cartão para uma cobrança real.\n\nEscolha um método\n\nAs faturas do novo workspace usam um preço base em USD e o plano Any oferece todos os quatro métodos. O SBP converte para RUB à taxa de referência congelada do Banco da Rússia; cripto usa a regra explícita de fatura 1:1 USD/USDT. O preço nativo legado permanece disponível para faturas antigas e solicitações de API sem pricingMode=universal. Consulte a seção de múltiplas lojas e preço em USD abaixo.\n\nCartão: o navegador criptografa os dados de pagamento com a chave pública do gateway. A Kevmi retransmite o envelope criptografado; seu servidor não aceita nem armazena números de cartão em texto plano, CVV ou códigos bancários de uso único. Um formulário de código bancário solicitado aparece apenas enquanto o desafio do gateway for válido.\n\nAlipay: o cliente fornece um nome e recebe um QR code. SBP abre a URL de pagamento bancário; um QR fornecido pelo gateway também pode ser usado. Uma expiração é exibida quando o gateway fornece uma.\n\nCripto: escolha uma moeda e depois uma rede disponível do catálogo atual. Após criar uma operação, o checkout exibe o valor decimal exato, endereço do destinatário e dois modos de QR: apenas endereço, ou endereço e valor. A rede da carteira deve corresponder à rede escolhida. O preço de uma fatura USDT não trava a taxa de câmbio de outra moeda: use o valor fornecido pelo gateway. Instruções expiradas são ocultas enquanto a conciliação continua para o mesmo pagamento.\n\nPara um novo pagamento ao vivo com cartão ou Alipay, o gateway atual suporta apenas feeCustomerPercent=0 e vatCustomerPercent=100: o comerciante cobre toda a taxa de processamento e o IVA é adicionado integralmente para o cliente. Outras parcelas podem ser salvas e calculadas em uma fatura, mas a execução é bloqueada com unsupported_allocation. O servidor nunca altera silenciosamente os termos salvos. Pagamentos SBP e USDT cripto suportam todas as parcelas de taxa de processamento e não têm IVA.\n\nEstados do checkout\n\nEstado · Significado · Próximo passo\nAtivo · A fatura está disponível para visualização · Verifique o total e a disponibilidade do método selecionado\nPausado / expirado / cancelado · Nenhum novo pagamento pode iniciar pelo link · Entre em contato com o vendedor; uma operação original é verificada separadamente\nNão encontrado · O endereço é inválido ou indisponível · Verifique o endereço completo\nPagamento indisponível · Uma nova operação é bloqueada por configuração, método, limite, alocação ou revisão do comerciante · Siga a mensagem exibida; os termos da fatura salva não mudam\nPendente / ação necessária · A operação original existe ou precisa de confirmação · Conclua a etapa atual ou verifique seu status\nResultado sendo verificado · Um resultado confirmado ainda não está disponível · Verifique a operação original; não crie uma segunda cobrança\n\nUm erro de rede ou resposta ausente não prova que nenhuma cobrança ocorreu. Uma operação já enviada permanece legível mesmo que o link não aceite mais novos pagamentos.\n\nO que confirma pagamento\n\nO pagamento é confirmado pela conciliação do servidor da operação exata do gateway. succeeded exige fulfillment_ready=true, verification=provider_confirmed, nenhuma disputa e correspondência exata entre o valor pago e o total aprovado. Cripto adicionalmente exige evidência de liquidação confirmada.\n\nUm redirecionamento, mensagem de widget, código bancário aceito ou observação do navegador não confirmam dinheiro. Após um timeout, leia o status da operação original; uma tentativa de substituição nunca é criada automaticamente.\n\nUm novo pagamento e uma intenção de cartão exigem que a solicitação mais recente de revisão do site do comerciante seja aprovada. A aprovação por si só não conecta o gateway de pagamento. Se a revisão mudar após o envio, a operação existente permanece disponível para leitura de status, conciliação e um código bancário solicitado.\n\nObtendo ajuda\n\nEnvie ao vendedor a referência ou endereço da fatura, o horário da tentativa e o erro exibido. Não envie CVV, senha bancária, código de confirmação ou frase-semente ao suporte. O assistente de documentação pode explicar termos, mas não pode confirmar um crédito de forma independente.\n\nAjuda de pagamento\n\nCálculo de IVA",
      "readMinutes": 5
    },
    {
      "id": "payments",
      "title": "Pagamentos e statuses",
      "summary": "Uma fatura descreve um pedido. Um pagamento é uma tentativa específica de pagá-lo. Uma tentativa de pagamento e a disponibilidade de seu link são estados separados.",
      "group": "payments",
      "url": "/docs/payments",
      "tags": [
        "pagamento",
        "status",
        "pendente",
        "bem-sucedido",
        "falhou"
      ],
      "sections": [
        {
          "id": "record",
          "title": "O registro de pagamento",
          "paragraphs": [
            "A fatura armazena os termos do pedido; o pagamento identifica sua operação no gateway. O primeiro lançamento reserva um vínculo durável e uma chave de idempotência do servidor. Após o início do envio, outro método não pode criar uma segunda cobrança na mesma fatura.",
            "GET /api/payment-links e GET /api/v1/payments retornam link.payment ao proprietário. O status ativo/pausado/cancelado/expirado do link é separado do estado do pagamento. Um cliente só pode ler sua operação por meio do token aleatório de checkout."
          ],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Dados",
              "Finalidade"
            ],
            "rows": [
              [
                "Identificador e pedido",
                "Associar a tentativa a uma compra"
              ],
              [
                "Valor base e moeda",
                "A base de cálculo"
              ],
              [
                "Método de pagamento",
                "Taxa e imposto aplicáveis"
              ],
              [
                "Contribuinte de IVA",
                "Quem cobre o imposto"
              ],
              [
                "Taxa, IVA e totais",
                "Cálculo salvo"
              ],
              [
                "Status e hora",
                "Estado atual da transação"
              ],
              [
                "Referência do evento do gateway",
                "Fonte de confirmação do servidor"
              ]
            ]
          },
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "statuses",
          "title": "Estados operacionais ao vivo",
          "paragraphs": [
            "A demonstração usa registros de teste separados. Alterar um estado de demonstração não confirma um pagamento real nem altera registros financeiros."
          ],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Status",
              "Significado"
            ],
            "rows": [
              [
                "pendente",
                "Operação criada; aguardando ação ou resultado"
              ],
              [
                "requires_action",
                "Um código bancário ou confirmação do cliente é necessário"
              ],
              [
                "processing",
                "O provedor ainda está confirmando o resultado"
              ],
              [
                "bem-sucedido",
                "O servidor verificou o pagamento exato"
              ],
              [
                "falhou",
                "A tentativa terminou sem pagamento confirmado"
              ],
              [
                "expired",
                "Instruções expiradas; a conciliação permanece disponível"
              ],
              [
                "review_required",
                "Revisão adicional é necessária; não pague novamente"
              ],
              [
                "partially_paid",
                "Apenas parte do valor foi recebida; não crie outro pagamento"
              ],
              [
                "partially_refunded",
                "Parte do pagamento foi reembolsada"
              ],
              [
                "refunded",
                "Reembolso confirmado"
              ],
              [
                "disputed",
                "A operação está em disputa"
              ]
            ]
          },
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "authority",
          "title": "A fonte da verdade",
          "paragraphs": [
            "Um webhook assinado aciona uma leitura autenticada da operação exata do gateway. IDs, pedido, moeda, método, valores base e final, modo ao vivo e versão monotônica são validados. Somente o nome de um evento recebido não é prova de dinheiro.",
            "Estado, recibo e evento do comerciante são confirmados atomicamente. Respostas mais antigas não podem sobrescrever uma versão mais nova; duplicatas não cumprem duas vezes, e pendente não pode substituir um pagamento confirmado. Esses registros não criam automaticamente um saldo sacável ou um pagamento."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "uncertain",
          "title": "Quando o resultado é desconhecido",
          "paragraphs": [],
          "bullets": [],
          "steps": [
            "Mantenha a fatura original e o identificador da operação.",
            "Leia GET /api/checkout/{token}/status; isso não cria uma cobrança.",
            "Use POST /api/checkout/{token}/reconcile quando a conciliação explícita for necessária.",
            "Não altere método, valor ou chave de idempotência após um resultado incerto."
          ],
          "table": null,
          "code": null,
          "note": "Um tempo esgotado não é uma recusa. Uma resposta perdida é recuperada pela chave original do servidor; nenhuma tentativa substituta é criada automaticamente.",
          "links": []
        },
        {
          "id": "stores-usd",
          "title": "Múltiplas lojas e um preço base em USD",
          "paragraphs": [
            "Escolha Todas as lojas para análises e operações agregadas, ou selecione uma loja para seus próprios registros. Cada loja tem um storeId separado, nome, padrão de IVA, faturas, chaves de API, endpoints de webhook, histórico de eventos e aplicativo de site. Notificações e tickets de suporte pertencem à conta. Uma conta pode criar até 100 lojas. Registros existentes permanecem na primeira loja.",
            "As faturas do novo workspace usam pricingMode=\"universal\" e um preço base em USD. O plano Any inclui cartão, alipay, sbp e cripto; um comerciante pode selecionar um subconjunto. Cartões e Alipay cobram em USD. O SBP cobra em RUB usando a taxa de referência USD/RUB do Banco da Rússia. Cripto cobra USDT sob a regra explícita de fatura 1 USD = 1 USDT. Esta é uma regra de conversão de fatura, não uma cotação de mercado de USDT. O gateway fornece a taxa da moeda selecionada, o valor exato da transferência e instruções antes da transferência.",
            "A taxa de referência e ambos os valores são congelados na criação. Faturas que envolvem conversão RUB expiram dentro de 24 horas. Se a taxa de referência não puder ser obtida, a criação falha com FX_UNAVAILABLE; nenhuma taxa de fallback inventada ou desatualizada é usada. O valor do proprietário em minor e cotações usam a moeda contábil USD. quotes[method].settlement contém a cotação de cobrança nativa. O checkout público expõe a moeda de cobrança selecionada em currency, o preço original em baseAmountMinor/baseCurrency, e a taxa de referência em fx. Uma vez que um pagamento foi enviado, seu método não pode ser alterado; uma fatura tem uma operação de gateway.",
            "Crie uma chave de API dentro da loja pretendida e envie Authorization: Bearer <key> do seu servidor. Seu vínculo de loja é imutável; X-Kevmi-Store não pode conceder acesso a outra loja. Sessões de navegador selecionam X-Kevmi-Store: <storeId>; omitir seleciona a primeira loja. O valor all é aceito apenas por GET /api/account/dashboard e GET /api/payment-links. Mutações exigem uma loja selecionada, Origin e X-CSRF-Token. IDs de conta e IDs de loja são identificadores diferentes.",
            "Para compatibilidade, solicitações de API sem pricingMode=\"universal\" mantêm preço nativo e as restrições originais de moeda. Faturas existentes nunca são recalculadas. Recibos confirmados nas análises refletem pagamentos verificados menos despesas de fatura salvas; eles não são um saldo sacável. Moedas de fatura legadas permanecem separadas e pagamentos são combinados com o suporte. Cumpra um pedido somente após verificar payment.fulfillmentReady=true e payment.status=\"succeeded\" através da API do servidor, histórico de eventos ou um webhook assinado."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        }
      ],
      "body": "O registro de pagamento\n\nA fatura armazena os termos do pedido; o pagamento identifica sua operação no gateway. O primeiro lançamento reserva um vínculo durável e uma chave de idempotência do servidor. Após o início do envio, outro método não pode criar uma segunda cobrança na mesma fatura.\n\nGET /api/payment-links e GET /api/v1/payments retornam link.payment ao proprietário. O status ativo/pausado/cancelado/expirado do link é separado do estado do pagamento. Um cliente só pode ler sua operação por meio do token aleatório de checkout.\n\nDados · Finalidade\nIdentificador e pedido · Associar a tentativa a uma compra\nValor base e moeda · A base de cálculo\nMétodo de pagamento · Taxa e imposto aplicáveis\nContribuinte de IVA · Quem cobre o imposto\nTaxa, IVA e totais · Cálculo salvo\nStatus e hora · Estado atual da transação\nReferência do evento do gateway · Fonte de confirmação do servidor\n\nEstados operacionais ao vivo\n\nA demonstração usa registros de teste separados. Alterar um estado de demonstração não confirma um pagamento real nem altera registros financeiros.\n\nStatus · Significado\npendente · Operação criada; aguardando ação ou resultado\nrequires_action · Um código bancário ou confirmação do cliente é necessário\nprocessing · O provedor ainda está confirmando o resultado\nbem-sucedido · O servidor verificou o pagamento exato\nfalhou · A tentativa terminou sem pagamento confirmado\nexpired · Instruções expiradas; a conciliação permanece disponível\nreview_required · Revisão adicional é necessária; não pague novamente\npartially_paid · Apenas parte do valor foi recebida; não crie outro pagamento\npartially_refunded · Parte do pagamento foi reembolsada\nrefunded · Reembolso confirmado\ndisputed · A operação está em disputa\n\nA fonte da verdade\n\nUm webhook assinado aciona uma leitura autenticada da operação exata do gateway. IDs, pedido, moeda, método, valores base e final, modo ao vivo e versão monotônica são validados. Somente o nome de um evento recebido não é prova de dinheiro.\n\nEstado, recibo e evento do comerciante são confirmados atomicamente. Respostas mais antigas não podem sobrescrever uma versão mais nova; duplicatas não cumprem duas vezes, e pendente não pode substituir um pagamento confirmado. Esses registros não criam automaticamente um saldo sacável ou um pagamento.\n\nQuando o resultado é desconhecido\n\nMantenha a fatura original e o identificador da operação.\n\nLeia GET /api/checkout/{token}/status; isso não cria uma cobrança.\n\nUse POST /api/checkout/{token}/reconcile quando a conciliação explícita for necessária.\n\nNão altere método, valor ou chave de idempotência após um resultado incerto.\n\nUm tempo esgotado não é uma recusa. Uma resposta perdida é recuperada pela chave original do servidor; nenhuma tentativa substituta é criada automaticamente.\n\nMúltiplas lojas e um preço base em USD\n\nEscolha Todas as lojas para análises e operações agregadas, ou selecione uma loja para seus próprios registros. Cada loja tem um storeId separado, nome, padrão de IVA, faturas, chaves de API, endpoints de webhook, histórico de eventos e aplicativo de site. Notificações e tickets de suporte pertencem à conta. Uma conta pode criar até 100 lojas. Registros existentes permanecem na primeira loja.\n\nAs faturas do novo workspace usam pricingMode=\"universal\" e um preço base em USD. O plano Any inclui cartão, alipay, sbp e cripto; um comerciante pode selecionar um subconjunto. Cartões e Alipay cobram em USD. O SBP cobra em RUB usando a taxa de referência USD/RUB do Banco da Rússia. Cripto cobra USDT sob a regra explícita de fatura 1 USD = 1 USDT. Esta é uma regra de conversão de fatura, não uma cotação de mercado de USDT. O gateway fornece a taxa da moeda selecionada, o valor exato da transferência e instruções antes da transferência.\n\nA taxa de referência e ambos os valores são congelados na criação. Faturas que envolvem conversão RUB expiram dentro de 24 horas. Se a taxa de referência não puder ser obtida, a criação falha com FX_UNAVAILABLE; nenhuma taxa de fallback inventada ou desatualizada é usada. O valor do proprietário em minor e cotações usam a moeda contábil USD. quotes[method].settlement contém a cotação de cobrança nativa. O checkout público expõe a moeda de cobrança selecionada em currency, o preço original em baseAmountMinor/baseCurrency, e a taxa de referência em fx. Uma vez que um pagamento foi enviado, seu método não pode ser alterado; uma fatura tem uma operação de gateway.\n\nCrie uma chave de API dentro da loja pretendida e envie Authorization: Bearer <key> do seu servidor. Seu vínculo de loja é imutável; X-Kevmi-Store não pode conceder acesso a outra loja. Sessões de navegador selecionam X-Kevmi-Store: <storeId>; omitir seleciona a primeira loja. O valor all é aceito apenas por GET /api/account/dashboard e GET /api/payment-links. Mutações exigem uma loja selecionada, Origin e X-CSRF-Token. IDs de conta e IDs de loja são identificadores diferentes.\n\nPara compatibilidade, solicitações de API sem pricingMode=\"universal\" mantêm preço nativo e as restrições originais de moeda. Faturas existentes nunca são recalculadas. Recibos confirmados nas análises refletem pagamentos verificados menos despesas de fatura salvas; eles não são um saldo sacável. Moedas de fatura legadas permanecem separadas e pagamentos são combinados com o suporte. Cumpra um pedido somente após verificar payment.fulfillmentReady=true e payment.status=\"succeeded\" através da API do servidor, histórico de eventos ou um webhook assinado.",
      "readMinutes": 3
    },
    {
      "id": "payouts",
      "title": "Pagamentos USDT TRC20",
      "summary": "Os termos de pagamento especificam USDT em TRC20, com taxas baseadas na origem dos fundos. Este guia cobre taxas, requisitos de cotação e restrições: as solicitações estão disponíveis diariamente; pagamentos com cartão internacional e Alipay são processados nos dias 1º e 15, UTC+5.",
      "group": "payments",
      "url": "/docs/payouts",
      "tags": [
        "pagamento",
        "saque",
        "USDT",
        "TRC20",
        "carteira",
        "taxa de câmbio"
      ],
      "sections": [
        {
          "id": "tariffs",
          "title": "Taxas por fonte",
          "paragraphs": [
            "A taxa de aceitação já foi incluída no crédito do comerciante. Um pagamento é uma operação separada com sua própria taxa. Não aplique a taxa de aceitação ao saldo uma segunda vez."
          ],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Fonte",
              "Taxa"
            ],
            "rows": [
              [
                "Cartões e Alipay",
                "4%"
              ],
              [
                "SBP",
                "5% + RUB 400"
              ],
              [
                "Criptomoeda",
                "0% + $3"
              ]
            ]
          },
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "quote",
          "title": "Cotações e moedas",
          "paragraphs": [
            "Valores em USD e RUB devem ser contabilizados separadamente. Não os some sem uma taxa de câmbio. USD é uma moeda fiduciária e USDT é um ativo digital; uma taxa de câmbio automática de 1:1 não é assumida.",
            "Uma cotação deve informar a moeda e o valor de origem, a taxa, a saída em USDT e a expiração. Alterações no valor ou na carteira exigem uma nova verificação dos termos."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "address",
          "title": "Endereço do destinatário",
          "paragraphs": [
            "Use um endereço TRC20 pertencente ao destinatário. A validação do formato do endereço pode detectar alguns erros de digitação, mas não pode verificar o proprietário nem garantir a entrega.",
            "Verifique o endereço completo e a rede antes de enviar. O servidor deve validar o valor, o saldo disponível e a cotação de forma independente do formulário do cliente."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "flow",
          "title": "O processo de pagamento",
          "paragraphs": [
            "A demonstração usa uma cotação inserida manualmente apenas para cálculo. Um pagamento de teste reserva fundos de demonstração e não transfere ativos."
          ],
          "bullets": [],
          "steps": [
            "Escolha a fonte dos fundos e o valor a debitar.",
            "Digite um endereço TRC20.",
            "Obtenha uma cotação atual e revise a taxa.",
            "Confirme os termos exatos da solicitação.",
            "Aguarde um resultado confirmado pelo servidor."
          ],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "availability",
          "title": "Disponibilidade de pagamento",
          "paragraphs": [
            "As solicitações de revisão de pagamento estão disponíveis em Conta → Pagamentos e por meio de /api/account/payout-requests. Selecione uma loja, fonte de recebimento, valor em USD e carteira USDT TRC20. As solicitações podem ser enviadas em qualquer dia. Pagamentos com cartão internacional e Alipay são processados somente nos dias 1º e 15 de cada mês no horário de Qyzylorda (UTC+5). A aprovação do servidor é bloqueada em outros dias. A restrição de calendário 1/15 não se aplica a SBP e criptomoedas. As solicitações não reservam fundos nem enviam dinheiro; o suporte verifica o valor disponível, a taxa, a cotação e o destino. A aprovação não confirma uma transferência. O legado /api/payouts não cria pagamentos.",
            "Pagamentos verificados, recibos e eventos são mantidos no histórico. Esses registros não são um saldo sacável. Executar um pagamento exige um livro de fundos separado, uma cotação atual, validação do destino e confirmação da transferência."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Integração com gateway",
              "href": "/docs/gateway"
            }
          ]
        }
      ],
      "body": "Taxas por fonte\n\nA taxa de aceitação já foi incluída no crédito do comerciante. Um pagamento é uma operação separada com sua própria taxa. Não aplique a taxa de aceitação ao saldo uma segunda vez.\n\nFonte · Taxa\nCartões e Alipay · 4%\nSBP · 5% + RUB 400\nCriptomoeda · 0% + $3\n\nCotações e moedas\n\nValores em USD e RUB devem ser contabilizados separadamente. Não os some sem uma taxa de câmbio. USD é uma moeda fiduciária e USDT é um ativo digital; uma taxa de câmbio automática de 1:1 não é assumida.\n\nUma cotação deve informar a moeda e o valor de origem, a taxa, a saída em USDT e a expiração. Alterações no valor ou na carteira exigem uma nova verificação dos termos.\n\nEndereço do destinatário\n\nUse um endereço TRC20 pertencente ao destinatário. A validação do formato do endereço pode detectar alguns erros de digitação, mas não pode verificar o proprietário nem garantir a entrega.\n\nVerifique o endereço completo e a rede antes de enviar. O servidor deve validar o valor, o saldo disponível e a cotação de forma independente do formulário do cliente.\n\nO processo de pagamento\n\nA demonstração usa uma cotação inserida manualmente apenas para cálculo. Um pagamento de teste reserva fundos de demonstração e não transfere ativos.\n\nEscolha a fonte dos fundos e o valor a debitar.\n\nDigite um endereço TRC20.\n\nObtenha uma cotação atual e revise a taxa.\n\nConfirme os termos exatos da solicitação.\n\nAguarde um resultado confirmado pelo servidor.\n\nDisponibilidade de pagamento\n\nAs solicitações de revisão de pagamento estão disponíveis em Conta → Pagamentos e por meio de /api/account/payout-requests. Selecione uma loja, fonte de recebimento, valor em USD e carteira USDT TRC20. As solicitações podem ser enviadas em qualquer dia. Pagamentos com cartão internacional e Alipay são processados somente nos dias 1º e 15 de cada mês no horário de Qyzylorda (UTC+5). A aprovação do servidor é bloqueada em outros dias. A restrição de calendário 1/15 não se aplica a SBP e criptomoedas. As solicitações não reservam fundos nem enviam dinheiro; o suporte verifica o valor disponível, a taxa, a cotação e o destino. A aprovação não confirma uma transferência. O legado /api/payouts não cria pagamentos.\n\nPagamentos verificados, recibos e eventos são mantidos no histórico. Esses registros não são um saldo sacável. Executar um pagamento exige um livro de fundos separado, uma cotação atual, validação do destino e confirmação da transferência.\n\nIntegração com gateway",
      "readMinutes": 3
    },
    {
      "id": "telegram-login",
      "title": "Entre e registre-se com o Telegram",
      "summary": "O Telegram verifica sua identidade. A Kevmi cria sua conta no primeiro acesso e a abre em visitas posteriores. Uma senha separada da Kevmi não é necessária.",
      "group": "account",
      "url": "/docs/telegram-login",
      "tags": [
        "Telegram",
        "entrar",
        "login",
        "registrar",
        "conta",
        "bot"
      ],
      "sections": [
        {
          "id": "steps",
          "title": "Entrando",
          "paragraphs": [
            "A solicitação dura cinco minutos. Inicie uma nova solicitação se ela expirar. Uma solicitação antiga não pode ser reutilizada para obter uma sessão."
          ],
          "bullets": [],
          "steps": [
            "Abra Entrar ou Criar conta e selecione Continuar com o Telegram.",
            "Siga o link do bot criado por este navegador.",
            "Compare o código de seis dígitos no site e na mensagem do bot.",
            "Confirme no chat privado.",
            "Volte ao navegador original. Sua conta abre após a verificação."
          ],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "browser",
          "title": "Por que o navegador original importa",
          "paragraphs": [
            "O link do Telegram está vinculado a um cookie protegido no navegador que iniciou o acesso. Um challengeId ou um link encaminhado sozinho não pode criar uma sessão em outro dispositivo.",
            "Você pode confirmar no Telegram em outro dispositivo, mas a conta abre no navegador onde o acesso começou. Não confirme uma solicitação que você não iniciou."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "session",
          "title": "Sessões e saída",
          "paragraphs": [
            "Uma sessão dura até 24 horas. Seu token aleatório é armazenado em um cookie Secure HttpOnly e não pode ser lido por JavaScript. A saída do site encerra a sessão atual.",
            "O comando do bot /logout encerra todas as sessões da conta e cancela confirmações não utilizadas. Um novo acesso exige uma nova solicitação."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "trouble",
          "title": "Solução de problemas de acesso",
          "paragraphs": [],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Situação",
              "Ação"
            ],
            "rows": [
              [
                "O link expirou",
                "Inicie uma nova solicitação no site"
              ],
              [
                "Um navegador diferente está aberto",
                "Volte à aba onde o acesso começou"
              ],
              [
                "Os códigos diferem",
                "Não confirme; comece novamente"
              ],
              [
                "Acesso indisponível",
                "Tente mais tarde ou entre em contato com o suporte"
              ],
              [
                "Erro de rede temporário",
                "Aguarde a próxima verificação ou tente entrar novamente"
              ]
            ]
          },
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "privacy",
          "title": "Informações usadas para o acesso",
          "paragraphs": [
            "O servidor recebe um ID de Telegram verificado e campos de perfil disponíveis para criar a conta. Um nome de usuário público sozinho não é prova de identidade.",
            "O bot não pede sua senha do Telegram, códigos bancários, CVV, frase-semente ou chaves privadas."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "API de Autenticação",
              "href": "/docs/auth-api"
            },
            {
              "label": "Entrar",
              "href": "/login"
            }
          ]
        },
        {
          "id": "assistant-admin-v16",
          "title": "Assistente, suporte e administração de projetos",
          "paragraphs": [
            "Um primeiro login pelo Telegram cria uma conta e uma loja rascunho com status not_submitted, não um comerciante aprovado. A conta abre o formulário de inscrição para revisão atual; aceitar pagamentos requer aprovação de especialista. Cada nova loja tem sua própria revisão. GET /api/stores retorna reviewStatus e applicationId. Lojas conectadas mantêm acesso agregado, e suporte e documentação permanecem disponíveis durante a revisão.",
            "Ativar Permitir acesso aos meus dados no chat quando precisar de ajuda com operações privadas. Uma solicitação da web com includeAccount=true exige uma sessão válida, Origin e X-CSRF-Token; X-Kevmi-Store seleciona uma loja própria ou todas as lojas próprias. Sem permissão, o assistente usa documentação pública. No Telegram, um botão separado permite o acesso depois que o remetente for identificado.",
            "A ferramenta read_account lê lojas próprias, faturas com status de recebimento verificado, eventos, aplicativos e solicitações de suporte com respostas de especialistas. Ela retorna 30 registros e nextPage; registros mais antigos estão disponíveis por paginação. As leituras por resposta são limitadas, portanto uma amostra incompleta deve ser divulgada. Chaves de API, segredos de webhook, detalhes de cartão e sessões não são fornecidos à ferramenta. Ela não pode cobrar, pagar, reembolsar ou alterar configurações.",
            "Criar uma solicitação de suporte no espaço de trabalho ou no Telegram coloca um alerta separado de administrador em uma fila durável. Ela vincula a /admin/tickets?ticket=<id>; falhas temporárias do Telegram são repetidas. A recuperação também pega solicitações abertas mais antigas sem alerta. Os administradores respondem na página da solicitação; a resposta é salva no espaço de trabalho do usuário e enviada pelo Telegram quando as notificações de suporte estão ativadas.",
            "O bot usa botões em linha para o menu principal, lojas, notificações, suporte, segurança e idioma. A navegação edita a mensagem atual; um menu antigo indisponível é substituído. Notificações de pagamento e segurança não são tratadas como navegação descartável. Sair pelo menu exige confirmação. O comando explícito /logout ainda encerra todas as sessões da conta.",
            "O painel /admin/project é restrito a IDs do Telegram na lista de permissão MODERATOR_TELEGRAM_IDS no lado do servidor. Inclui usuários, lojas, operações, revogação de chaves, desativação de webhooks, pausa de faturas, controles de aceitação e um registro de auditoria. Mutações exigem CSRF e um motivo. O painel não pode restringir um administrador nem declarar manualmente um pagamento como bem-sucedido. Restringir um proprietário encerra sessões e bloqueia o acesso a chaves de API; restringir uma loja interrompe novas operações. O histórico é mantido.",
            "A oferta pública está disponível em /public-offer e a política de privacidade em /privacy-policy em todos os idiomas habilitados. Pesquise moedas por nome ou ticker. Um seletor de rede aparece somente quando várias redes ativas estão disponíveis. Uma única rede é selecionada automaticamente e permanece nomeada na confirmação. A disponibilidade ao vivo do gateway determina os pares selecionáveis; o catálogo de referência não habilita um serviço.",
            "Use update.sh para lançamentos de rotina do app da web: compile o candidato, verifique o histórico de migrações, faça backup do SQLite online, inicie um segundo contêiner, verifique-o e alterne o Caddy sem interrupção. Gateway, PostgreSQL e e-mail não são reiniciados. Ativos estáticos anteriores permanecem disponíveis para abas abertas. Uma nova migração exige autorização revisada explícita; uma mudança incompatível de esquema não é uma implantação sem interrupção."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Oferta pública",
              "href": "/public-offer"
            },
            {
              "label": "Política de privacidade",
              "href": "/privacy-policy"
            }
          ]
        }
      ],
      "body": "Entrando\n\nA solicitação dura cinco minutos. Inicie uma nova solicitação se ela expirar. Uma solicitação antiga não pode ser reutilizada para obter uma sessão.\n\nAbra Entrar ou Criar conta e selecione Continuar com o Telegram.\n\nSiga o link do bot criado por este navegador.\n\nCompare o código de seis dígitos no site e na mensagem do bot.\n\nConfirme no chat privado.\n\nVolte ao navegador original. Sua conta abre após a verificação.\n\nPor que o navegador original importa\n\nO link do Telegram está vinculado a um cookie protegido no navegador que iniciou o acesso. Um challengeId ou um link encaminhado sozinho não pode criar uma sessão em outro dispositivo.\n\nVocê pode confirmar no Telegram em outro dispositivo, mas a conta abre no navegador onde o acesso começou. Não confirme uma solicitação que você não iniciou.\n\nSessões e saída\n\nUma sessão dura até 24 horas. Seu token aleatório é armazenado em um cookie Secure HttpOnly e não pode ser lido por JavaScript. A saída do site encerra a sessão atual.\n\nO comando do bot /logout encerra todas as sessões da conta e cancela confirmações não utilizadas. Um novo acesso exige uma nova solicitação.\n\nSolução de problemas de acesso\n\nSituação · Ação\nO link expirou · Inicie uma nova solicitação no site\nUm navegador diferente está aberto · Volte à aba onde o acesso começou\nOs códigos diferem · Não confirme; comece novamente\nAcesso indisponível · Tente mais tarde ou entre em contato com o suporte\nErro de rede temporário · Aguarde a próxima verificação ou tente entrar novamente\n\nInformações usadas para o acesso\n\nO servidor recebe um ID de Telegram verificado e campos de perfil disponíveis para criar a conta. Um nome de usuário público sozinho não é prova de identidade.\n\nO bot não pede sua senha do Telegram, códigos bancários, CVV, frase-semente ou chaves privadas.\n\nAPI de Autenticação\n\nEntrar\n\nAssistente, suporte e administração de projetos\n\nUm primeiro login pelo Telegram cria uma conta e uma loja rascunho com status not_submitted, não um comerciante aprovado. A conta abre o formulário de inscrição para revisão atual; aceitar pagamentos requer aprovação de especialista. Cada nova loja tem sua própria revisão. GET /api/stores retorna reviewStatus e applicationId. Lojas conectadas mantêm acesso agregado, e suporte e documentação permanecem disponíveis durante a revisão.\n\nAtivar Permitir acesso aos meus dados no chat quando precisar de ajuda com operações privadas. Uma solicitação da web com includeAccount=true exige uma sessão válida, Origin e X-CSRF-Token; X-Kevmi-Store seleciona uma loja própria ou todas as lojas próprias. Sem permissão, o assistente usa documentação pública. No Telegram, um botão separado permite o acesso depois que o remetente for identificado.\n\nA ferramenta read_account lê lojas próprias, faturas com status de recebimento verificado, eventos, aplicativos e solicitações de suporte com respostas de especialistas. Ela retorna 30 registros e nextPage; registros mais antigos estão disponíveis por paginação. As leituras por resposta são limitadas, portanto uma amostra incompleta deve ser divulgada. Chaves de API, segredos de webhook, detalhes de cartão e sessões não são fornecidos à ferramenta. Ela não pode cobrar, pagar, reembolsar ou alterar configurações.\n\nCriar uma solicitação de suporte no espaço de trabalho ou no Telegram coloca um alerta separado de administrador em uma fila durável. Ela vincula a /admin/tickets?ticket=<id>; falhas temporárias do Telegram são repetidas. A recuperação também pega solicitações abertas mais antigas sem alerta. Os administradores respondem na página da solicitação; a resposta é salva no espaço de trabalho do usuário e enviada pelo Telegram quando as notificações de suporte estão ativadas.\n\nO bot usa botões em linha para o menu principal, lojas, notificações, suporte, segurança e idioma. A navegação edita a mensagem atual; um menu antigo indisponível é substituído. Notificações de pagamento e segurança não são tratadas como navegação descartável. Sair pelo menu exige confirmação. O comando explícito /logout ainda encerra todas as sessões da conta.\n\nO painel /admin/project é restrito a IDs do Telegram na lista de permissão MODERATOR_TELEGRAM_IDS no lado do servidor. Inclui usuários, lojas, operações, revogação de chaves, desativação de webhooks, pausa de faturas, controles de aceitação e um registro de auditoria. Mutações exigem CSRF e um motivo. O painel não pode restringir um administrador nem declarar manualmente um pagamento como bem-sucedido. Restringir um proprietário encerra sessões e bloqueia o acesso a chaves de API; restringir uma loja interrompe novas operações. O histórico é mantido.\n\nA oferta pública está disponível em /public-offer e a política de privacidade em /privacy-policy em todos os idiomas habilitados. Pesquise moedas por nome ou ticker. Um seletor de rede aparece somente quando várias redes ativas estão disponíveis. Uma única rede é selecionada automaticamente e permanece nomeada na confirmação. A disponibilidade ao vivo do gateway determina os pares selecionáveis; o catálogo de referência não habilita um serviço.\n\nUse update.sh para lançamentos de rotina do app da web: compile o candidato, verifique o histórico de migrações, faça backup do SQLite online, inicie um segundo contêiner, verifique-o e alterne o Caddy sem interrupção. Gateway, PostgreSQL e e-mail não são reiniciados. Ativos estáticos anteriores permanecem disponíveis para abas abertas. Uma nova migração exige autorização revisada explícita; uma mudança incompatível de esquema não é uma implantação sem interrupção.\n\nOferta pública\n\nPolítica de privacidade",
      "readMinutes": 3
    },
    {
      "id": "settings",
      "title": "Configurações da loja",
      "summary": "Configurações conectam o nome da sua loja, a regra de IVA e as notificações à sua conta verificada. As alterações são salvas no servidor para o usuário atual.",
      "group": "account",
      "url": "/docs/settings",
      "tags": [
        "configurações",
        "loja",
        "Contribuinte de IVA",
        "tema",
        "notificações"
      ],
      "sections": [
        {
          "id": "name",
          "title": "Nome da loja",
          "paragraphs": [
            "Escolha um nome curto e reconhecível que seu cliente espera ver no pedido. O nome deve conter de 1 a 80 caracteres após remover espaços nas bordas.",
            "Um nome de exibição não substitui os dados legais nem o acordo com o cliente. Mantenha segredos, credenciais de pagamento e informações pessoais de outras pessoas fora deste campo."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "vat",
          "title": "Contribuinte de IVA",
          "paragraphs": [
            "O pagador padrão é o cliente. O IVA se aplica apenas a cartões e Alipay. Alterar a configuração não muda os totais de SBP ou criptomoedas.",
            "Faturas existentes mantêm seus termos salvos. Ao criar uma fatura, o IVA do cliente e as participações de taxas de 0 a 100% podem substituir os padrões. A preferência da loja apenas fornece um padrão para faturas futuras.",
            "Uma preferência salva não expande os recursos do gateway. Os canais atuais de cartão e Alipay exigem 100% de IVA do cliente e 0% de taxa de processamento do cliente; outras alocações salvas permanecem como cálculos."
          ],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Valor",
              "Regra para uma nova fatura"
            ],
            "rows": [
              [
                "cliente",
                "O IVA é adicionado ao preço base do cliente"
              ],
              [
                "loja",
                "O comerciante cobre o IVA a partir do preço base"
              ]
            ]
          },
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "notifications",
          "title": "Notificações do Telegram",
          "paragraphs": [
            "Selecione as categorias de pagamento, pagamentos, suporte e segurança. Escolher uma categoria controla as notificações; não ativa um canal de pagamento nem gera eventos financeiros.",
            "Uma mensagem de teste verifica a entrega no chat privado vinculado. O status aparece no centro de notificações e em GET /api/notifications. Uma mensagem na fila ainda não foi entregue; verifique também o Telegram."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Guia de notificações",
              "href": "/docs/notifications"
            }
          ]
        },
        {
          "id": "saving",
          "title": "Salvar e erros",
          "paragraphs": [
            "O formulário confirma um salvamento concluído. Se a rede falhar, sua entrada permanece disponível para uma nova tentativa; pressionar Salvar sozinho não prova que a alteração foi armazenada.",
            "Entre novamente quando sua sessão expirar. O servidor identifica a conta pela sessão e não aceita outro ID de proprietário de loja vindo do navegador."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "local",
          "title": "Tema e dados de demonstração",
          "paragraphs": [
            "O tema de exibição é salvo localmente no dispositivo. O espaço de trabalho de demonstração usa dados de navegador separados e não altera a conta do servidor.",
            "Redefinir a demonstração remove apenas os registros de teste nesse navegador. Uma exportação de demonstração não é um extrato bancário nem uma prova de pagamento."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "stores-usd",
          "title": "Múltiplas lojas e um preço base em USD",
          "paragraphs": [
            "Escolha Todas as lojas para análises e operações agregadas, ou selecione uma loja para seus próprios registros. Cada loja tem um storeId separado, nome, padrão de IVA, faturas, chaves de API, endpoints de webhook, histórico de eventos e aplicativo de site. Notificações e tickets de suporte pertencem à conta. Uma conta pode criar até 100 lojas. Registros existentes permanecem na primeira loja.",
            "As faturas do novo workspace usam pricingMode=\"universal\" e um preço base em USD. O plano Any inclui cartão, alipay, sbp e cripto; um comerciante pode selecionar um subconjunto. Cartões e Alipay cobram em USD. O SBP cobra em RUB usando a taxa de referência USD/RUB do Banco da Rússia. Cripto cobra USDT sob a regra explícita de fatura 1 USD = 1 USDT. Esta é uma regra de conversão de fatura, não uma cotação de mercado de USDT. O gateway fornece a taxa da moeda selecionada, o valor exato da transferência e instruções antes da transferência.",
            "A taxa de referência e ambos os valores são congelados na criação. Faturas que envolvem conversão RUB expiram dentro de 24 horas. Se a taxa de referência não puder ser obtida, a criação falha com FX_UNAVAILABLE; nenhuma taxa de fallback inventada ou desatualizada é usada. O valor do proprietário em minor e cotações usam a moeda contábil USD. quotes[method].settlement contém a cotação de cobrança nativa. O checkout público expõe a moeda de cobrança selecionada em currency, o preço original em baseAmountMinor/baseCurrency, e a taxa de referência em fx. Uma vez que um pagamento foi enviado, seu método não pode ser alterado; uma fatura tem uma operação de gateway.",
            "Crie uma chave de API dentro da loja pretendida e envie Authorization: Bearer <key> do seu servidor. Seu vínculo de loja é imutável; X-Kevmi-Store não pode conceder acesso a outra loja. Sessões de navegador selecionam X-Kevmi-Store: <storeId>; omitir seleciona a primeira loja. O valor all é aceito apenas por GET /api/account/dashboard e GET /api/payment-links. Mutações exigem uma loja selecionada, Origin e X-CSRF-Token. IDs de conta e IDs de loja são identificadores diferentes.",
            "Para compatibilidade, solicitações de API sem pricingMode=\"universal\" mantêm preço nativo e as restrições originais de moeda. Faturas existentes nunca são recalculadas. Recibos confirmados nas análises refletem pagamentos verificados menos despesas de fatura salvas; eles não são um saldo sacável. Moedas de fatura legadas permanecem separadas e pagamentos são combinados com o suporte. Cumpra um pedido somente após verificar payment.fulfillmentReady=true e payment.status=\"succeeded\" através da API do servidor, histórico de eventos ou um webhook assinado."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "assistant-admin-v16",
          "title": "Assistente, suporte e administração de projetos",
          "paragraphs": [
            "Um primeiro login pelo Telegram cria uma conta e uma loja rascunho com status not_submitted, não um comerciante aprovado. A conta abre o formulário de inscrição para revisão atual; aceitar pagamentos requer aprovação de especialista. Cada nova loja tem sua própria revisão. GET /api/stores retorna reviewStatus e applicationId. Lojas conectadas mantêm acesso agregado, e suporte e documentação permanecem disponíveis durante a revisão.",
            "Ativar Permitir acesso aos meus dados no chat quando precisar de ajuda com operações privadas. Uma solicitação da web com includeAccount=true exige uma sessão válida, Origin e X-CSRF-Token; X-Kevmi-Store seleciona uma loja própria ou todas as lojas próprias. Sem permissão, o assistente usa documentação pública. No Telegram, um botão separado permite o acesso depois que o remetente for identificado.",
            "A ferramenta read_account lê lojas próprias, faturas com status de recebimento verificado, eventos, aplicativos e solicitações de suporte com respostas de especialistas. Ela retorna 30 registros e nextPage; registros mais antigos estão disponíveis por paginação. As leituras por resposta são limitadas, portanto uma amostra incompleta deve ser divulgada. Chaves de API, segredos de webhook, detalhes de cartão e sessões não são fornecidos à ferramenta. Ela não pode cobrar, pagar, reembolsar ou alterar configurações.",
            "Criar uma solicitação de suporte no espaço de trabalho ou no Telegram coloca um alerta separado de administrador em uma fila durável. Ela vincula a /admin/tickets?ticket=<id>; falhas temporárias do Telegram são repetidas. A recuperação também pega solicitações abertas mais antigas sem alerta. Os administradores respondem na página da solicitação; a resposta é salva no espaço de trabalho do usuário e enviada pelo Telegram quando as notificações de suporte estão ativadas.",
            "O bot usa botões em linha para o menu principal, lojas, notificações, suporte, segurança e idioma. A navegação edita a mensagem atual; um menu antigo indisponível é substituído. Notificações de pagamento e segurança não são tratadas como navegação descartável. Sair pelo menu exige confirmação. O comando explícito /logout ainda encerra todas as sessões da conta.",
            "O painel /admin/project é restrito a IDs do Telegram na lista de permissão MODERATOR_TELEGRAM_IDS no lado do servidor. Inclui usuários, lojas, operações, revogação de chaves, desativação de webhooks, pausa de faturas, controles de aceitação e um registro de auditoria. Mutações exigem CSRF e um motivo. O painel não pode restringir um administrador nem declarar manualmente um pagamento como bem-sucedido. Restringir um proprietário encerra sessões e bloqueia o acesso a chaves de API; restringir uma loja interrompe novas operações. O histórico é mantido.",
            "A oferta pública está disponível em /public-offer e a política de privacidade em /privacy-policy em todos os idiomas habilitados. Pesquise moedas por nome ou ticker. Um seletor de rede aparece somente quando várias redes ativas estão disponíveis. Uma única rede é selecionada automaticamente e permanece nomeada na confirmação. A disponibilidade ao vivo do gateway determina os pares selecionáveis; o catálogo de referência não habilita um serviço.",
            "Use update.sh para lançamentos de rotina do app da web: compile o candidato, verifique o histórico de migrações, faça backup do SQLite online, inicie um segundo contêiner, verifique-o e alterne o Caddy sem interrupção. Gateway, PostgreSQL e e-mail não são reiniciados. Ativos estáticos anteriores permanecem disponíveis para abas abertas. Uma nova migração exige autorização revisada explícita; uma mudança incompatível de esquema não é uma implantação sem interrupção."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Oferta pública",
              "href": "/public-offer"
            },
            {
              "label": "Política de privacidade",
              "href": "/privacy-policy"
            }
          ]
        }
      ],
      "body": "Nome da loja\n\nEscolha um nome curto e reconhecível que seu cliente espera ver no pedido. O nome deve conter de 1 a 80 caracteres após remover espaços nas bordas.\n\nUm nome de exibição não substitui os dados legais nem o acordo com o cliente. Mantenha segredos, credenciais de pagamento e informações pessoais de outras pessoas fora deste campo.\n\nContribuinte de IVA\n\nO pagador padrão é o cliente. O IVA se aplica apenas a cartões e Alipay. Alterar a configuração não muda os totais de SBP ou criptomoedas.\n\nFaturas existentes mantêm seus termos salvos. Ao criar uma fatura, o IVA do cliente e as participações de taxas de 0 a 100% podem substituir os padrões. A preferência da loja apenas fornece um padrão para faturas futuras.\n\nUma preferência salva não expande os recursos do gateway. Os canais atuais de cartão e Alipay exigem 100% de IVA do cliente e 0% de taxa de processamento do cliente; outras alocações salvas permanecem como cálculos.\n\nValor · Regra para uma nova fatura\ncliente · O IVA é adicionado ao preço base do cliente\nloja · O comerciante cobre o IVA a partir do preço base\n\nNotificações do Telegram\n\nSelecione as categorias de pagamento, pagamentos, suporte e segurança. Escolher uma categoria controla as notificações; não ativa um canal de pagamento nem gera eventos financeiros.\n\nUma mensagem de teste verifica a entrega no chat privado vinculado. O status aparece no centro de notificações e em GET /api/notifications. Uma mensagem na fila ainda não foi entregue; verifique também o Telegram.\n\nGuia de notificações\n\nSalvar e erros\n\nO formulário confirma um salvamento concluído. Se a rede falhar, sua entrada permanece disponível para uma nova tentativa; pressionar Salvar sozinho não prova que a alteração foi armazenada.\n\nEntre novamente quando sua sessão expirar. O servidor identifica a conta pela sessão e não aceita outro ID de proprietário de loja vindo do navegador.\n\nTema e dados de demonstração\n\nO tema de exibição é salvo localmente no dispositivo. O espaço de trabalho de demonstração usa dados de navegador separados e não altera a conta do servidor.\n\nRedefinir a demonstração remove apenas os registros de teste nesse navegador. Uma exportação de demonstração não é um extrato bancário nem uma prova de pagamento.\n\nMúltiplas lojas e um preço base em USD\n\nEscolha Todas as lojas para análises e operações agregadas, ou selecione uma loja para seus próprios registros. Cada loja tem um storeId separado, nome, padrão de IVA, faturas, chaves de API, endpoints de webhook, histórico de eventos e aplicativo de site. Notificações e tickets de suporte pertencem à conta. Uma conta pode criar até 100 lojas. Registros existentes permanecem na primeira loja.\n\nAs faturas do novo workspace usam pricingMode=\"universal\" e um preço base em USD. O plano Any inclui cartão, alipay, sbp e cripto; um comerciante pode selecionar um subconjunto. Cartões e Alipay cobram em USD. O SBP cobra em RUB usando a taxa de referência USD/RUB do Banco da Rússia. Cripto cobra USDT sob a regra explícita de fatura 1 USD = 1 USDT. Esta é uma regra de conversão de fatura, não uma cotação de mercado de USDT. O gateway fornece a taxa da moeda selecionada, o valor exato da transferência e instruções antes da transferência.\n\nA taxa de referência e ambos os valores são congelados na criação. Faturas que envolvem conversão RUB expiram dentro de 24 horas. Se a taxa de referência não puder ser obtida, a criação falha com FX_UNAVAILABLE; nenhuma taxa de fallback inventada ou desatualizada é usada. O valor do proprietário em minor e cotações usam a moeda contábil USD. quotes[method].settlement contém a cotação de cobrança nativa. O checkout público expõe a moeda de cobrança selecionada em currency, o preço original em baseAmountMinor/baseCurrency, e a taxa de referência em fx. Uma vez que um pagamento foi enviado, seu método não pode ser alterado; uma fatura tem uma operação de gateway.\n\nCrie uma chave de API dentro da loja pretendida e envie Authorization: Bearer <key> do seu servidor. Seu vínculo de loja é imutável; X-Kevmi-Store não pode conceder acesso a outra loja. Sessões de navegador selecionam X-Kevmi-Store: <storeId>; omitir seleciona a primeira loja. O valor all é aceito apenas por GET /api/account/dashboard e GET /api/payment-links. Mutações exigem uma loja selecionada, Origin e X-CSRF-Token. IDs de conta e IDs de loja são identificadores diferentes.\n\nPara compatibilidade, solicitações de API sem pricingMode=\"universal\" mantêm preço nativo e as restrições originais de moeda. Faturas existentes nunca são recalculadas. Recibos confirmados nas análises refletem pagamentos verificados menos despesas de fatura salvas; eles não são um saldo sacável. Moedas de fatura legadas permanecem separadas e pagamentos são combinados com o suporte. Cumpra um pedido somente após verificar payment.fulfillmentReady=true e payment.status=\"succeeded\" através da API do servidor, histórico de eventos ou um webhook assinado.\n\nAssistente, suporte e administração de projetos\n\nUm primeiro login pelo Telegram cria uma conta e uma loja rascunho com status not_submitted, não um comerciante aprovado. A conta abre o formulário de inscrição para revisão atual; aceitar pagamentos requer aprovação de especialista. Cada nova loja tem sua própria revisão. GET /api/stores retorna reviewStatus e applicationId. Lojas conectadas mantêm acesso agregado, e suporte e documentação permanecem disponíveis durante a revisão.\n\nAtivar Permitir acesso aos meus dados no chat quando precisar de ajuda com operações privadas. Uma solicitação da web com includeAccount=true exige uma sessão válida, Origin e X-CSRF-Token; X-Kevmi-Store seleciona uma loja própria ou todas as lojas próprias. Sem permissão, o assistente usa documentação pública. No Telegram, um botão separado permite o acesso depois que o remetente for identificado.\n\nA ferramenta read_account lê lojas próprias, faturas com status de recebimento verificado, eventos, aplicativos e solicitações de suporte com respostas de especialistas. Ela retorna 30 registros e nextPage; registros mais antigos estão disponíveis por paginação. As leituras por resposta são limitadas, portanto uma amostra incompleta deve ser divulgada. Chaves de API, segredos de webhook, detalhes de cartão e sessões não são fornecidos à ferramenta. Ela não pode cobrar, pagar, reembolsar ou alterar configurações.\n\nCriar uma solicitação de suporte no espaço de trabalho ou no Telegram coloca um alerta separado de administrador em uma fila durável. Ela vincula a /admin/tickets?ticket=<id>; falhas temporárias do Telegram são repetidas. A recuperação também pega solicitações abertas mais antigas sem alerta. Os administradores respondem na página da solicitação; a resposta é salva no espaço de trabalho do usuário e enviada pelo Telegram quando as notificações de suporte estão ativadas.\n\nO bot usa botões em linha para o menu principal, lojas, notificações, suporte, segurança e idioma. A navegação edita a mensagem atual; um menu antigo indisponível é substituído. Notificações de pagamento e segurança não são tratadas como navegação descartável. Sair pelo menu exige confirmação. O comando explícito /logout ainda encerra todas as sessões da conta.\n\nO painel /admin/project é restrito a IDs do Telegram na lista de permissão MODERATOR_TELEGRAM_IDS no lado do servidor. Inclui usuários, lojas, operações, revogação de chaves, desativação de webhooks, pausa de faturas, controles de aceitação e um registro de auditoria. Mutações exigem CSRF e um motivo. O painel não pode restringir um administrador nem declarar manualmente um pagamento como bem-sucedido. Restringir um proprietário encerra sessões e bloqueia o acesso a chaves de API; restringir uma loja interrompe novas operações. O histórico é mantido.\n\nA oferta pública está disponível em /public-offer e a política de privacidade em /privacy-policy em todos os idiomas habilitados. Pesquise moedas por nome ou ticker. Um seletor de rede aparece somente quando várias redes ativas estão disponíveis. Uma única rede é selecionada automaticamente e permanece nomeada na confirmação. A disponibilidade ao vivo do gateway determina os pares selecionáveis; o catálogo de referência não habilita um serviço.\n\nUse update.sh para lançamentos de rotina do app da web: compile o candidato, verifique o histórico de migrações, faça backup do SQLite online, inicie um segundo contêiner, verifique-o e alterne o Caddy sem interrupção. Gateway, PostgreSQL e e-mail não são reiniciados. Ativos estáticos anteriores permanecem disponíveis para abas abertas. Uma nova migração exige autorização revisada explícita; uma mudança incompatível de esquema não é uma implantação sem interrupção.\n\nOferta pública\n\nPolítica de privacidade",
      "readMinutes": 3
    },
    {
      "id": "notifications",
      "title": "Notificações do site e do Telegram",
      "summary": "Eventos da conta aparecem sob o sino na barra superior. Leia as notificações, verifique a entrega no Telegram e abra a parte relevante do seu espaço de trabalho.",
      "group": "account",
      "url": "/docs/notifications",
      "tags": [
        "notificações",
        "Telegram",
        "sino",
        "ler",
        "entrega"
      ],
      "sections": [
        {
          "id": "inbox",
          "title": "Centro de notificações",
          "paragraphs": [
            "O selo conta eventos de conta não lidos. As mensagens são agrupadas por data; Carregar mais recupera registros mais antigos. Visitantes são convidados a entrar.",
            "O estado de leitura é armazenado no servidor. As páginas visíveis atualizam automaticamente e as abas abertas sincronizam as marcas de leitura. Eventos mais recentes do que a última mensagem exibida não são marcados como lidos junto com os mais antigos."
          ],
          "bullets": [],
          "steps": [
            "Selecione o sino na barra superior.",
            "Escolha todos os eventos ou apenas os não lidos.",
            "Abra a página relacionada ou marque uma mensagem como lida.",
            "Use Marcar todos como lidos para eventos já carregados."
          ],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "types",
          "title": "Categorias de eventos",
          "paragraphs": [
            "Suporte e segurança estão ativados para uma nova conta; categorias de pagamento são selecionadas pelo usuário. O centro mostra eventos salvos para categorias ativadas. Eventos de demonstração no navegador não são notificações reais de fundos."
          ],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Categoria",
              "Conteúdo"
            ],
            "rows": [
              [
                "Pagamentos",
                "Eventos de pagamento confirmados"
              ],
              [
                "Pagamentos ao comerciante",
                "Eventos de pagamentos ao comerciante confirmados"
              ],
              [
                "Suporte",
                "Solicitações de suporte e atualizações de estágio do aplicativo"
              ],
              [
                "Segurança",
                "Um novo login verificado"
              ],
              [
                "Teste",
                "Verificação de entrega no seu Telegram"
              ]
            ]
          },
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "setup",
          "title": "Configurando a entrega",
          "paragraphs": [
            "Os testes são limitados a três por conta por hora. Um teste não altera um saldo nem cria um pagamento. Colocar uma mensagem na fila não prova a entrega."
          ],
          "bullets": [],
          "steps": [
            "Entre no Telegram e abra Conta → Notificações.",
            "Ative as categorias desejadas e salve.",
            "Selecione Testar entrega.",
            "Verifique o status do centro e o chat privado do bot."
          ],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Configurações de notificação",
              "href": "/account#notifications"
            }
          ]
        },
        {
          "id": "statuses",
          "title": "Os estados de entrega e leitura são separados",
          "paragraphs": [
            "A entrega depende da disponibilidade do Telegram e das permissões do usuário. Uma resposta perdida pode levar a uma mensagem repetida, mas não a uma operação financeira repetida.",
            "Se a entrega falhar, verifique se o bot está acessível e não bloqueado. As novas tentativas de notificação do aplicativo também são executadas em tarefas em segundo plano; interações de serviço podem acionar outras entregas na fila. Verifique o centro de notificações para o status atual."
          ],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Status",
              "Significado"
            ],
            "rows": [
              [
                "pendente",
                "Na fila para processamento"
              ],
              [
                "enviando",
                "O servidor está tentando a entrega"
              ],
              [
                "enviado",
                "O Telegram confirmou o envio"
              ],
              [
                "falhou",
                "Falha na entrega"
              ]
            ]
          },
          "code": null,
          "note": "O status de entrega da mensagem refere-se ao Telegram. Marcar uma notificação como lida no site não significa que ela foi lida no Telegram e não altera a entrega.",
          "links": []
        },
        {
          "id": "feedback",
          "title": "Confirmações de ações",
          "paragraphs": [
            "O site mostra uma notificação curta após um salvamento concluído, um novo link ou uma ação semelhante. Ela fecha automaticamente e permanece por mais tempo quando o cursor está sobre ela ou ela está em foco.",
            "Isso confirma a ação da interface. Não substitui um status financeiro confirmado nem cria um registro de pagamento. Erros de campo permanecem ao lado do formulário."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "api",
          "title": "Leitura e marcação via API",
          "paragraphs": [
            "GET /api/notifications retorna até 30 eventos de conta, unreadCount e nextCursor. Passe nextCursor inalterado como cursor para carregar outra página. unread=1 seleciona entradas não lidas. A ordem de classificação é createdAt decrescente, depois id decrescente.",
            "PATCH /api/notifications/read aceita 1–100 ids ou all:true com before definido como o timestamp em milissegundos do último evento exibido. Uma sessão, Origin e X-CSRF-Token são necessários. O cliente não pode definir o proprietário do registro.",
            "A resposta contém updated, readAt e unreadCount. Ler um evento já lido mantém seu readAt original. Listar eventos não os marca como lidos; o status do Telegram e sentAt permanecem inalterados."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": {
            "language": "JSON · mark selected",
            "code": "{\n  \"ids\": [\"ntf_46d94180-492e-4c28-b15f-a70049161a63\"]\n}"
          },
          "note": "",
          "links": [
            {
              "label": "Referência da API",
              "href": "/docs/api-reference"
            }
          ]
        },
        {
          "id": "commands",
          "title": "Comandos do bot",
          "paragraphs": [],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Comando",
              "Ação"
            ],
            "rows": [
              [
                "/notifications",
                "Gerenciar categorias"
              ],
              [
                "/stop",
                "Desativar notificações"
              ],
              [
                "/help",
                "Listar comandos disponíveis"
              ],
              [
                "/logout",
                "Encerrar todas as sessões da conta"
              ]
            ]
          },
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "availability",
          "title": "Disponibilidade de recursos",
          "paragraphs": [
            "O centro de notificações exige login. As mensagens do Telegram são enviadas ao chat privado verificado do bot. Se a entrega não estiver disponível, verifique as permissões do bot e o status da mensagem.",
            "Uma notificação de pagamento ou pagamento é baseada em um evento de servidor confirmado. Selecionar uma categoria altera as preferências de entrega, não a disponibilidade de transações."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "assistant-admin-v16",
          "title": "Assistente, suporte e administração de projetos",
          "paragraphs": [
            "Um primeiro login pelo Telegram cria uma conta e uma loja rascunho com status not_submitted, não um comerciante aprovado. A conta abre o formulário de inscrição para revisão atual; aceitar pagamentos requer aprovação de especialista. Cada nova loja tem sua própria revisão. GET /api/stores retorna reviewStatus e applicationId. Lojas conectadas mantêm acesso agregado, e suporte e documentação permanecem disponíveis durante a revisão.",
            "Ativar Permitir acesso aos meus dados no chat quando precisar de ajuda com operações privadas. Uma solicitação da web com includeAccount=true exige uma sessão válida, Origin e X-CSRF-Token; X-Kevmi-Store seleciona uma loja própria ou todas as lojas próprias. Sem permissão, o assistente usa documentação pública. No Telegram, um botão separado permite o acesso depois que o remetente for identificado.",
            "A ferramenta read_account lê lojas próprias, faturas com status de recebimento verificado, eventos, aplicativos e solicitações de suporte com respostas de especialistas. Ela retorna 30 registros e nextPage; registros mais antigos estão disponíveis por paginação. As leituras por resposta são limitadas, portanto uma amostra incompleta deve ser divulgada. Chaves de API, segredos de webhook, detalhes de cartão e sessões não são fornecidos à ferramenta. Ela não pode cobrar, pagar, reembolsar ou alterar configurações.",
            "Criar uma solicitação de suporte no espaço de trabalho ou no Telegram coloca um alerta separado de administrador em uma fila durável. Ela vincula a /admin/tickets?ticket=<id>; falhas temporárias do Telegram são repetidas. A recuperação também pega solicitações abertas mais antigas sem alerta. Os administradores respondem na página da solicitação; a resposta é salva no espaço de trabalho do usuário e enviada pelo Telegram quando as notificações de suporte estão ativadas.",
            "O bot usa botões em linha para o menu principal, lojas, notificações, suporte, segurança e idioma. A navegação edita a mensagem atual; um menu antigo indisponível é substituído. Notificações de pagamento e segurança não são tratadas como navegação descartável. Sair pelo menu exige confirmação. O comando explícito /logout ainda encerra todas as sessões da conta.",
            "O painel /admin/project é restrito a IDs do Telegram na lista de permissão MODERATOR_TELEGRAM_IDS no lado do servidor. Inclui usuários, lojas, operações, revogação de chaves, desativação de webhooks, pausa de faturas, controles de aceitação e um registro de auditoria. Mutações exigem CSRF e um motivo. O painel não pode restringir um administrador nem declarar manualmente um pagamento como bem-sucedido. Restringir um proprietário encerra sessões e bloqueia o acesso a chaves de API; restringir uma loja interrompe novas operações. O histórico é mantido.",
            "A oferta pública está disponível em /public-offer e a política de privacidade em /privacy-policy em todos os idiomas habilitados. Pesquise moedas por nome ou ticker. Um seletor de rede aparece somente quando várias redes ativas estão disponíveis. Uma única rede é selecionada automaticamente e permanece nomeada na confirmação. A disponibilidade ao vivo do gateway determina os pares selecionáveis; o catálogo de referência não habilita um serviço.",
            "Use update.sh para lançamentos de rotina do app da web: compile o candidato, verifique o histórico de migrações, faça backup do SQLite online, inicie um segundo contêiner, verifique-o e alterne o Caddy sem interrupção. Gateway, PostgreSQL e e-mail não são reiniciados. Ativos estáticos anteriores permanecem disponíveis para abas abertas. Uma nova migração exige autorização revisada explícita; uma mudança incompatível de esquema não é uma implantação sem interrupção."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Oferta pública",
              "href": "/public-offer"
            },
            {
              "label": "Política de privacidade",
              "href": "/privacy-policy"
            }
          ]
        }
      ],
      "body": "Centro de notificações\n\nO selo conta eventos de conta não lidos. As mensagens são agrupadas por data; Carregar mais recupera registros mais antigos. Visitantes são convidados a entrar.\n\nO estado de leitura é armazenado no servidor. As páginas visíveis atualizam automaticamente e as abas abertas sincronizam as marcas de leitura. Eventos mais recentes do que a última mensagem exibida não são marcados como lidos junto com os mais antigos.\n\nSelecione o sino na barra superior.\n\nEscolha todos os eventos ou apenas os não lidos.\n\nAbra a página relacionada ou marque uma mensagem como lida.\n\nUse Marcar todos como lidos para eventos já carregados.\n\nCategorias de eventos\n\nSuporte e segurança estão ativados para uma nova conta; categorias de pagamento são selecionadas pelo usuário. O centro mostra eventos salvos para categorias ativadas. Eventos de demonstração no navegador não são notificações reais de fundos.\n\nCategoria · Conteúdo\nPagamentos · Eventos de pagamento confirmados\nPagamentos ao comerciante · Eventos de pagamentos ao comerciante confirmados\nSuporte · Solicitações de suporte e atualizações de estágio do aplicativo\nSegurança · Um novo login verificado\nTeste · Verificação de entrega no seu Telegram\n\nConfigurando a entrega\n\nOs testes são limitados a três por conta por hora. Um teste não altera um saldo nem cria um pagamento. Colocar uma mensagem na fila não prova a entrega.\n\nEntre no Telegram e abra Conta → Notificações.\n\nAtive as categorias desejadas e salve.\n\nSelecione Testar entrega.\n\nVerifique o status do centro e o chat privado do bot.\n\nConfigurações de notificação\n\nOs estados de entrega e leitura são separados\n\nA entrega depende da disponibilidade do Telegram e das permissões do usuário. Uma resposta perdida pode levar a uma mensagem repetida, mas não a uma operação financeira repetida.\n\nSe a entrega falhar, verifique se o bot está acessível e não bloqueado. As novas tentativas de notificação do aplicativo também são executadas em tarefas em segundo plano; interações de serviço podem acionar outras entregas na fila. Verifique o centro de notificações para o status atual.\n\nStatus · Significado\npendente · Na fila para processamento\nenviando · O servidor está tentando a entrega\nenviado · O Telegram confirmou o envio\nfalhou · Falha na entrega\n\nO status de entrega da mensagem refere-se ao Telegram. Marcar uma notificação como lida no site não significa que ela foi lida no Telegram e não altera a entrega.\n\nConfirmações de ações\n\nO site mostra uma notificação curta após um salvamento concluído, um novo link ou uma ação semelhante. Ela fecha automaticamente e permanece por mais tempo quando o cursor está sobre ela ou ela está em foco.\n\nIsso confirma a ação da interface. Não substitui um status financeiro confirmado nem cria um registro de pagamento. Erros de campo permanecem ao lado do formulário.\n\nLeitura e marcação via API\n\nGET /api/notifications retorna até 30 eventos de conta, unreadCount e nextCursor. Passe nextCursor inalterado como cursor para carregar outra página. unread=1 seleciona entradas não lidas. A ordem de classificação é createdAt decrescente, depois id decrescente.\n\nPATCH /api/notifications/read aceita 1–100 ids ou all:true com before definido como o timestamp em milissegundos do último evento exibido. Uma sessão, Origin e X-CSRF-Token são necessários. O cliente não pode definir o proprietário do registro.\n\nA resposta contém updated, readAt e unreadCount. Ler um evento já lido mantém seu readAt original. Listar eventos não os marca como lidos; o status do Telegram e sentAt permanecem inalterados.\n\n{\n  \"ids\": [\"ntf_46d94180-492e-4c28-b15f-a70049161a63\"]\n}\n\nReferência da API\n\nComandos do bot\n\nComando · Ação\n/notifications · Gerenciar categorias\n/stop · Desativar notificações\n/help · Listar comandos disponíveis\n/logout · Encerrar todas as sessões da conta\n\nDisponibilidade de recursos\n\nO centro de notificações exige login. As mensagens do Telegram são enviadas ao chat privado verificado do bot. Se a entrega não estiver disponível, verifique as permissões do bot e o status da mensagem.\n\nUma notificação de pagamento ou pagamento é baseada em um evento de servidor confirmado. Selecionar uma categoria altera as preferências de entrega, não a disponibilidade de transações.\n\nAssistente, suporte e administração de projetos\n\nUm primeiro login pelo Telegram cria uma conta e uma loja rascunho com status not_submitted, não um comerciante aprovado. A conta abre o formulário de inscrição para revisão atual; aceitar pagamentos requer aprovação de especialista. Cada nova loja tem sua própria revisão. GET /api/stores retorna reviewStatus e applicationId. Lojas conectadas mantêm acesso agregado, e suporte e documentação permanecem disponíveis durante a revisão.\n\nAtivar Permitir acesso aos meus dados no chat quando precisar de ajuda com operações privadas. Uma solicitação da web com includeAccount=true exige uma sessão válida, Origin e X-CSRF-Token; X-Kevmi-Store seleciona uma loja própria ou todas as lojas próprias. Sem permissão, o assistente usa documentação pública. No Telegram, um botão separado permite o acesso depois que o remetente for identificado.\n\nA ferramenta read_account lê lojas próprias, faturas com status de recebimento verificado, eventos, aplicativos e solicitações de suporte com respostas de especialistas. Ela retorna 30 registros e nextPage; registros mais antigos estão disponíveis por paginação. As leituras por resposta são limitadas, portanto uma amostra incompleta deve ser divulgada. Chaves de API, segredos de webhook, detalhes de cartão e sessões não são fornecidos à ferramenta. Ela não pode cobrar, pagar, reembolsar ou alterar configurações.\n\nCriar uma solicitação de suporte no espaço de trabalho ou no Telegram coloca um alerta separado de administrador em uma fila durável. Ela vincula a /admin/tickets?ticket=<id>; falhas temporárias do Telegram são repetidas. A recuperação também pega solicitações abertas mais antigas sem alerta. Os administradores respondem na página da solicitação; a resposta é salva no espaço de trabalho do usuário e enviada pelo Telegram quando as notificações de suporte estão ativadas.\n\nO bot usa botões em linha para o menu principal, lojas, notificações, suporte, segurança e idioma. A navegação edita a mensagem atual; um menu antigo indisponível é substituído. Notificações de pagamento e segurança não são tratadas como navegação descartável. Sair pelo menu exige confirmação. O comando explícito /logout ainda encerra todas as sessões da conta.\n\nO painel /admin/project é restrito a IDs do Telegram na lista de permissão MODERATOR_TELEGRAM_IDS no lado do servidor. Inclui usuários, lojas, operações, revogação de chaves, desativação de webhooks, pausa de faturas, controles de aceitação e um registro de auditoria. Mutações exigem CSRF e um motivo. O painel não pode restringir um administrador nem declarar manualmente um pagamento como bem-sucedido. Restringir um proprietário encerra sessões e bloqueia o acesso a chaves de API; restringir uma loja interrompe novas operações. O histórico é mantido.\n\nA oferta pública está disponível em /public-offer e a política de privacidade em /privacy-policy em todos os idiomas habilitados. Pesquise moedas por nome ou ticker. Um seletor de rede aparece somente quando várias redes ativas estão disponíveis. Uma única rede é selecionada automaticamente e permanece nomeada na confirmação. A disponibilidade ao vivo do gateway determina os pares selecionáveis; o catálogo de referência não habilita um serviço.\n\nUse update.sh para lançamentos de rotina do app da web: compile o candidato, verifique o histórico de migrações, faça backup do SQLite online, inicie um segundo contêiner, verifique-o e alterne o Caddy sem interrupção. Gateway, PostgreSQL e e-mail não são reiniciados. Ativos estáticos anteriores permanecem disponíveis para abas abertas. Uma nova migração exige autorização revisada explícita; uma mudança incompatível de esquema não é uma implantação sem interrupção.\n\nOferta pública\n\nPolítica de privacidade",
      "readMinutes": 4
    },
    {
      "id": "support",
      "title": "Chat de suporte e solicitações",
      "summary": "O assistente explica os termos da Kevmi, encontra a página certa e ajuda com configurações. Abra o chat usando o botão redondo no canto inferior direito. Use uma solicitação privada para uma pergunta específica da conta.",
      "group": "account",
      "url": "/docs/support",
      "tags": [
        "suporte",
        "ajuda",
        "AI",
        "assistente",
        "documentação",
        "solicitação",
        "chat"
      ],
      "sections": [
        {
          "id": "chat",
          "title": "Ajuda na página atual",
          "paragraphs": [
            "Em celulares, o chat abre em um painel compacto. Você pode minimizá-lo e reabri-lo; um selo aparece se uma resposta chegar enquanto ele está fechado.",
            "O suporte abre na página atual. O antigo endereço /help redireciona para a página inicial com o chat aberto."
          ],
          "bullets": [],
          "steps": [
            "Selecione o botão redondo de suporte no canto inferior direito ou Pergunte sua pergunta.",
            "Abra uma conversa existente ou comece uma nova. Escolha uma sugestão ou digite uma pergunta: Enter envia; Shift + Enter adiciona uma linha.",
            "Leia a resposta e siga suas fontes de documentação.",
            "Minimize o chat para continuar trabalhando. Mensagens e o rascunho permanecem neste navegador."
          ],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Abrir chat de suporte",
              "href": "/?support=open"
            }
          ]
        },
        {
          "id": "history",
          "title": "Conversas, rascunhos e histórico",
          "paragraphs": [
            "Mantenha cada tópico em uma conversa separada. Pesquise o histórico por título ou texto, renomeie uma conversa e fixe as importantes. Uma nova conversa preserva os chats anteriores, e cada um mantém seu próprio rascunho.",
            "Restaure uma conversa de Excluídos ou exclua-a permanentemente após confirmação. O histórico é armazenado no navegador deste dispositivo, sobrevive a recarregamentos de página e não sincroniza entre dispositivos, sua conta ou o Telegram. Limpar os dados do site no navegador remove o histórico local.",
            "Se o armazenamento do navegador não estiver disponível, o chat continua na memória da página aberta. Conversas locais são separadas de solicitações privadas de suporte, que são armazenadas no servidor após o login."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "knowledge",
          "title": "Em que as respostas são baseadas",
          "paragraphs": [
            "O site e o bot usam uma base de conhecimento com versão. O servidor fornece guias publicados, preços estruturados, alocação e fatos de países, o catálogo de páginas e a prontidão real de recursos ao assistente generativo. A base inclui aplicativos, chaves de API, widgets e webhooks.",
            "As fontes das respostas referem-se apenas a artigos dessa base. Quando a informação confirmada é insuficiente, o assistente diz isso e sugere uma pergunta mais específica ou uma solicitação de suporte. Ele não inventa países, prazos de pagamento, limites ou obrigações fiscais."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "context",
          "title": "Perguntas de acompanhamento e contexto",
          "paragraphs": [
            "A próxima pergunta inclui os últimos três pares de pergunta e resposta da conversa selecionada, ajudando com acompanhamentos como \"E se o comerciante pagar o IVA?\". Outro histórico local não é anexado automaticamente à solicitação.",
            "Um rótulo curto de seção, como Preços ou Checkout, também é enviado. A URL, parâmetros de consulta e o token de fatura são excluídos. Mensagens anteriores são contexto não confiável e são verificadas contra a base de conhecimento."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "modes",
          "title": "IA e pesquisa de documentação",
          "paragraphs": [
            "O modo de IA usa um provedor configurado, armazenamento no servidor e uma cota disponível. /api/config relata a prontidão da configuração; a conectividade do modelo é verificada em uma solicitação. Geração indisponível, cota esgotada ou uma resposta inválida recorre à pesquisa de documentação rotulada.",
            "A pesquisa também funciona sem um modelo externo. Registros privados exigem permissão explícita do proprietário e são somente leitura. Sem permissão, apenas informações públicas estão disponíveis. Não é possível cobrar fundos, criar pagamentos ou alterar configurações."
          ],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Modo",
              "Comportamento"
            ],
            "rows": [
              [
                "ai",
                "Escreve uma resposta a partir do conhecimento publicado completo e vincula guias relevantes"
              ],
              [
                "pesquisa",
                "Retorna a documentação publicada correspondente"
              ]
            ]
          },
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "question",
          "title": "Fazer uma pergunta útil",
          "paragraphs": [
            "Por exemplo: “Um pedido de cartão de $5, com IVA pago pelo comerciante. O que o comerciante recebe?” Verifique os valores exatos na calculadora publicada.",
            "O campo de chat aceita até 1.800 caracteres. Se a conexão falhar, a pergunta permanece no campo para outra tentativa."
          ],
          "bullets": [
            "Nomeie o método: cartão, SBP, Alipay ou criptomoeda.",
            "Para um cálculo, informe o valor base e ambas as parcelas de custo do cliente: taxa e IVA.",
            "Para um erro, nomeie a página, a ação e a mensagem exibida.",
            "Não envie senhas, códigos de login, tokens, CVV ou frases-semente."
          ],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "request",
          "title": "Fazer perguntas pela API",
          "paragraphs": [
            "POST /api/support/ask aceita pergunta com 2–2.000 caracteres após remoção de espaços. O histórico opcional contém até seis mensagens com role=user ou role=assistant. Mensagens de usuário aceitam 1–1.800 caracteres e mensagens de assistente, 1–3.000.",
            "O pageContext opcional é um rótulo de seção de 1–80 caracteres, sem URLs, tokens, parâmetros de consulta ou quebras de linha. O locale opcional é ru, en, es, de ou fr e seleciona o idioma da resposta. O inglês é o padrão; fontes técnicas completas estão disponíveis em russo e inglês. A API não aceita mensagens de sistema, ferramentas ou instruções arbitrárias do provedor.",
            "O limite do corpo JSON é de 65.536 bytes. A resposta contém mode, answer, sources, knowledgeVersion e needsHuman, com aiUnavailable:true quando a geração está indisponível. Nenhuma sessão de usuário é necessária; um Origin fornecido deve corresponder ao aplicativo."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Contrato da API",
              "href": "/docs/api-reference"
            }
          ]
        },
        {
          "id": "ticket",
          "title": "Solicitações de suporte privadas",
          "paragraphs": [
            "Após entrar, crie uma solicitação com um assunto de 1–120 caracteres e uma mensagem de 5–4.000 caracteres. Ela fica armazenada na sua conta e não é visível para outro usuário.",
            "A lista mostra as 30 solicitações mais recentes. Você pode fechar sua própria solicitação. Guarde a referência dela ao perguntar sobre o status; o tempo de resolução depende do problema."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Minhas solicitações de suporte",
              "href": "/account#support"
            }
          ]
        },
        {
          "id": "assistant-admin-v16",
          "title": "Assistente, suporte e administração de projetos",
          "paragraphs": [
            "Um primeiro login pelo Telegram cria uma conta e uma loja rascunho com status not_submitted, não um comerciante aprovado. A conta abre o formulário de inscrição para revisão atual; aceitar pagamentos requer aprovação de especialista. Cada nova loja tem sua própria revisão. GET /api/stores retorna reviewStatus e applicationId. Lojas conectadas mantêm acesso agregado, e suporte e documentação permanecem disponíveis durante a revisão.",
            "Ativar Permitir acesso aos meus dados no chat quando precisar de ajuda com operações privadas. Uma solicitação da web com includeAccount=true exige uma sessão válida, Origin e X-CSRF-Token; X-Kevmi-Store seleciona uma loja própria ou todas as lojas próprias. Sem permissão, o assistente usa documentação pública. No Telegram, um botão separado permite o acesso depois que o remetente for identificado.",
            "A ferramenta read_account lê lojas próprias, faturas com status de recebimento verificado, eventos, aplicativos e solicitações de suporte com respostas de especialistas. Ela retorna 30 registros e nextPage; registros mais antigos estão disponíveis por paginação. As leituras por resposta são limitadas, portanto uma amostra incompleta deve ser divulgada. Chaves de API, segredos de webhook, detalhes de cartão e sessões não são fornecidos à ferramenta. Ela não pode cobrar, pagar, reembolsar ou alterar configurações.",
            "Criar uma solicitação de suporte no espaço de trabalho ou no Telegram coloca um alerta separado de administrador em uma fila durável. Ela vincula a /admin/tickets?ticket=<id>; falhas temporárias do Telegram são repetidas. A recuperação também pega solicitações abertas mais antigas sem alerta. Os administradores respondem na página da solicitação; a resposta é salva no espaço de trabalho do usuário e enviada pelo Telegram quando as notificações de suporte estão ativadas.",
            "O bot usa botões em linha para o menu principal, lojas, notificações, suporte, segurança e idioma. A navegação edita a mensagem atual; um menu antigo indisponível é substituído. Notificações de pagamento e segurança não são tratadas como navegação descartável. Sair pelo menu exige confirmação. O comando explícito /logout ainda encerra todas as sessões da conta.",
            "O painel /admin/project é restrito a IDs do Telegram na lista de permissão MODERATOR_TELEGRAM_IDS no lado do servidor. Inclui usuários, lojas, operações, revogação de chaves, desativação de webhooks, pausa de faturas, controles de aceitação e um registro de auditoria. Mutações exigem CSRF e um motivo. O painel não pode restringir um administrador nem declarar manualmente um pagamento como bem-sucedido. Restringir um proprietário encerra sessões e bloqueia o acesso a chaves de API; restringir uma loja interrompe novas operações. O histórico é mantido.",
            "A oferta pública está disponível em /public-offer e a política de privacidade em /privacy-policy em todos os idiomas habilitados. Pesquise moedas por nome ou ticker. Um seletor de rede aparece somente quando várias redes ativas estão disponíveis. Uma única rede é selecionada automaticamente e permanece nomeada na confirmação. A disponibilidade ao vivo do gateway determina os pares selecionáveis; o catálogo de referência não habilita um serviço.",
            "Use update.sh para lançamentos de rotina do app da web: compile o candidato, verifique o histórico de migrações, faça backup do SQLite online, inicie um segundo contêiner, verifique-o e alterne o Caddy sem interrupção. Gateway, PostgreSQL e e-mail não são reiniciados. Ativos estáticos anteriores permanecem disponíveis para abas abertas. Uma nova migração exige autorização revisada explícita; uma mudança incompatível de esquema não é uma implantação sem interrupção."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Oferta pública",
              "href": "/public-offer"
            },
            {
              "label": "Política de privacidade",
              "href": "/privacy-policy"
            }
          ]
        }
      ],
      "body": "Ajuda na página atual\n\nEm celulares, o chat abre em um painel compacto. Você pode minimizá-lo e reabri-lo; um selo aparece se uma resposta chegar enquanto ele está fechado.\n\nO suporte abre na página atual. O antigo endereço /help redireciona para a página inicial com o chat aberto.\n\nSelecione o botão redondo de suporte no canto inferior direito ou Pergunte sua pergunta.\n\nAbra uma conversa existente ou comece uma nova. Escolha uma sugestão ou digite uma pergunta: Enter envia; Shift + Enter adiciona uma linha.\n\nLeia a resposta e siga suas fontes de documentação.\n\nMinimize o chat para continuar trabalhando. Mensagens e o rascunho permanecem neste navegador.\n\nAbrir chat de suporte\n\nConversas, rascunhos e histórico\n\nMantenha cada tópico em uma conversa separada. Pesquise o histórico por título ou texto, renomeie uma conversa e fixe as importantes. Uma nova conversa preserva os chats anteriores, e cada um mantém seu próprio rascunho.\n\nRestaure uma conversa de Excluídos ou exclua-a permanentemente após confirmação. O histórico é armazenado no navegador deste dispositivo, sobrevive a recarregamentos de página e não sincroniza entre dispositivos, sua conta ou o Telegram. Limpar os dados do site no navegador remove o histórico local.\n\nSe o armazenamento do navegador não estiver disponível, o chat continua na memória da página aberta. Conversas locais são separadas de solicitações privadas de suporte, que são armazenadas no servidor após o login.\n\nEm que as respostas são baseadas\n\nO site e o bot usam uma base de conhecimento com versão. O servidor fornece guias publicados, preços estruturados, alocação e fatos de países, o catálogo de páginas e a prontidão real de recursos ao assistente generativo. A base inclui aplicativos, chaves de API, widgets e webhooks.\n\nAs fontes das respostas referem-se apenas a artigos dessa base. Quando a informação confirmada é insuficiente, o assistente diz isso e sugere uma pergunta mais específica ou uma solicitação de suporte. Ele não inventa países, prazos de pagamento, limites ou obrigações fiscais.\n\nPerguntas de acompanhamento e contexto\n\nA próxima pergunta inclui os últimos três pares de pergunta e resposta da conversa selecionada, ajudando com acompanhamentos como \"E se o comerciante pagar o IVA?\". Outro histórico local não é anexado automaticamente à solicitação.\n\nUm rótulo curto de seção, como Preços ou Checkout, também é enviado. A URL, parâmetros de consulta e o token de fatura são excluídos. Mensagens anteriores são contexto não confiável e são verificadas contra a base de conhecimento.\n\nIA e pesquisa de documentação\n\nO modo de IA usa um provedor configurado, armazenamento no servidor e uma cota disponível. /api/config relata a prontidão da configuração; a conectividade do modelo é verificada em uma solicitação. Geração indisponível, cota esgotada ou uma resposta inválida recorre à pesquisa de documentação rotulada.\n\nA pesquisa também funciona sem um modelo externo. Registros privados exigem permissão explícita do proprietário e são somente leitura. Sem permissão, apenas informações públicas estão disponíveis. Não é possível cobrar fundos, criar pagamentos ou alterar configurações.\n\nModo · Comportamento\nai · Escreve uma resposta a partir do conhecimento publicado completo e vincula guias relevantes\npesquisa · Retorna a documentação publicada correspondente\n\nFazer uma pergunta útil\n\nPor exemplo: “Um pedido de cartão de $5, com IVA pago pelo comerciante. O que o comerciante recebe?” Verifique os valores exatos na calculadora publicada.\n\nO campo de chat aceita até 1.800 caracteres. Se a conexão falhar, a pergunta permanece no campo para outra tentativa.\n\nNomeie o método: cartão, SBP, Alipay ou criptomoeda.\n\nPara um cálculo, informe o valor base e ambas as parcelas de custo do cliente: taxa e IVA.\n\nPara um erro, nomeie a página, a ação e a mensagem exibida.\n\nNão envie senhas, códigos de login, tokens, CVV ou frases-semente.\n\nFazer perguntas pela API\n\nPOST /api/support/ask aceita pergunta com 2–2.000 caracteres após remoção de espaços. O histórico opcional contém até seis mensagens com role=user ou role=assistant. Mensagens de usuário aceitam 1–1.800 caracteres e mensagens de assistente, 1–3.000.\n\nO pageContext opcional é um rótulo de seção de 1–80 caracteres, sem URLs, tokens, parâmetros de consulta ou quebras de linha. O locale opcional é ru, en, es, de ou fr e seleciona o idioma da resposta. O inglês é o padrão; fontes técnicas completas estão disponíveis em russo e inglês. A API não aceita mensagens de sistema, ferramentas ou instruções arbitrárias do provedor.\n\nO limite do corpo JSON é de 65.536 bytes. A resposta contém mode, answer, sources, knowledgeVersion e needsHuman, com aiUnavailable:true quando a geração está indisponível. Nenhuma sessão de usuário é necessária; um Origin fornecido deve corresponder ao aplicativo.\n\nContrato da API\n\nSolicitações de suporte privadas\n\nApós entrar, crie uma solicitação com um assunto de 1–120 caracteres e uma mensagem de 5–4.000 caracteres. Ela fica armazenada na sua conta e não é visível para outro usuário.\n\nA lista mostra as 30 solicitações mais recentes. Você pode fechar sua própria solicitação. Guarde a referência dela ao perguntar sobre o status; o tempo de resolução depende do problema.\n\nMinhas solicitações de suporte\n\nAssistente, suporte e administração de projetos\n\nUm primeiro login pelo Telegram cria uma conta e uma loja rascunho com status not_submitted, não um comerciante aprovado. A conta abre o formulário de inscrição para revisão atual; aceitar pagamentos requer aprovação de especialista. Cada nova loja tem sua própria revisão. GET /api/stores retorna reviewStatus e applicationId. Lojas conectadas mantêm acesso agregado, e suporte e documentação permanecem disponíveis durante a revisão.\n\nAtivar Permitir acesso aos meus dados no chat quando precisar de ajuda com operações privadas. Uma solicitação da web com includeAccount=true exige uma sessão válida, Origin e X-CSRF-Token; X-Kevmi-Store seleciona uma loja própria ou todas as lojas próprias. Sem permissão, o assistente usa documentação pública. No Telegram, um botão separado permite o acesso depois que o remetente for identificado.\n\nA ferramenta read_account lê lojas próprias, faturas com status de recebimento verificado, eventos, aplicativos e solicitações de suporte com respostas de especialistas. Ela retorna 30 registros e nextPage; registros mais antigos estão disponíveis por paginação. As leituras por resposta são limitadas, portanto uma amostra incompleta deve ser divulgada. Chaves de API, segredos de webhook, detalhes de cartão e sessões não são fornecidos à ferramenta. Ela não pode cobrar, pagar, reembolsar ou alterar configurações.\n\nCriar uma solicitação de suporte no espaço de trabalho ou no Telegram coloca um alerta separado de administrador em uma fila durável. Ela vincula a /admin/tickets?ticket=<id>; falhas temporárias do Telegram são repetidas. A recuperação também pega solicitações abertas mais antigas sem alerta. Os administradores respondem na página da solicitação; a resposta é salva no espaço de trabalho do usuário e enviada pelo Telegram quando as notificações de suporte estão ativadas.\n\nO bot usa botões em linha para o menu principal, lojas, notificações, suporte, segurança e idioma. A navegação edita a mensagem atual; um menu antigo indisponível é substituído. Notificações de pagamento e segurança não são tratadas como navegação descartável. Sair pelo menu exige confirmação. O comando explícito /logout ainda encerra todas as sessões da conta.\n\nO painel /admin/project é restrito a IDs do Telegram na lista de permissão MODERATOR_TELEGRAM_IDS no lado do servidor. Inclui usuários, lojas, operações, revogação de chaves, desativação de webhooks, pausa de faturas, controles de aceitação e um registro de auditoria. Mutações exigem CSRF e um motivo. O painel não pode restringir um administrador nem declarar manualmente um pagamento como bem-sucedido. Restringir um proprietário encerra sessões e bloqueia o acesso a chaves de API; restringir uma loja interrompe novas operações. O histórico é mantido.\n\nA oferta pública está disponível em /public-offer e a política de privacidade em /privacy-policy em todos os idiomas habilitados. Pesquise moedas por nome ou ticker. Um seletor de rede aparece somente quando várias redes ativas estão disponíveis. Uma única rede é selecionada automaticamente e permanece nomeada na confirmação. A disponibilidade ao vivo do gateway determina os pares selecionáveis; o catálogo de referência não habilita um serviço.\n\nUse update.sh para lançamentos de rotina do app da web: compile o candidato, verifique o histórico de migrações, faça backup do SQLite online, inicie um segundo contêiner, verifique-o e alterne o Caddy sem interrupção. Gateway, PostgreSQL e e-mail não são reiniciados. Ativos estáticos anteriores permanecem disponíveis para abas abertas. Uma nova migração exige autorização revisada explícita; uma mudança incompatível de esquema não é uma implantação sem interrupção.\n\nOferta pública\n\nPolítica de privacidade",
      "readMinutes": 6
    },
    {
      "id": "api-reference",
      "title": "Referência da API",
      "summary": "A API do servidor suporta contas, faturas, checkout seguro, status e webhooks. OpenAPI descreve rotas, campos e erros. Iniciar um pagamento exige um gateway configurado, um comerciante aprovado e termos de fatura suportados.",
      "group": "developers",
      "url": "/docs/api-reference",
      "tags": [
        "API",
        "OpenAPI",
        "endpoint",
        "referência",
        "JSON"
      ],
      "sections": [
        {
          "id": "base",
          "title": "URL base e formato",
          "paragraphs": [
            "A URL base é https://kevmi.one. Corpos de solicitação e resposta usam JSON. Valores monetários são unidades menores inteiras. Datas de conta e suporte são timestamps Unix em milissegundos.",
            "Respostas da API usam Cache-Control: no-store. O /openapi.json público pode ser armazenado em cache por cinco minutos. Não coloque cookies ou segredos em uma 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": "Autorização de solicitação",
          "paragraphs": [
            "A conta web usa um cookie de sessão HttpOnly. GET /api/auth/me retorna o usuário atual e csrfToken. Mutações exigem X-CSRF-Token e uma solicitação de mesma origem.",
            "Chaves de comerciante Kevmi com escopo autorizam /api/v1/payments, /api/v1/payment-links e /api/v1/events. Elas não substituem o cookie de sessão para configurações de conta ou rotas administrativas."
          ],
          "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": "Grupos de endpoints",
          "paragraphs": [
            "GET /api/config informa a presença da configuração do servidor. GET /api/checkout/{token} retorna invoice.availability para o método selecionado, incluindo aprovação do comerciante e termos salvos. Essas verificações não estabelecem conectividade do provedor nem sucesso do pagamento: o resultado vem da operação verificada do gateway."
          ],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Grupo",
              "Finalidade"
            ],
            "rows": [
              [
                "Configuração e saúde",
                "Prontidão do serviço público e de armazenamento"
              ],
              [
                "Autenticação",
                "Desafios e sessões do Telegram"
              ],
              [
                "Conta",
                "Configurações e o aplicativo privado do comerciante"
              ],
              [
                "/api/v1/payments",
                "Criação e leitura de faturas de servidor com escopo; não inicia uma cobrança"
              ],
              [
                "/api/v1/events",
                "Registro de eventos do servidor com events:read"
              ],
              [
                "Integrações",
                "Administração de chaves e endpoints de webhook autenticados por sessão"
              ],
              [
                "Aplicativos e moderação",
                "Envios de propriedade, acompanhamento de status e permissões separadas de moderador"
              ],
              [
                "Checkout",
                "Fatura pública, solicitação de cartão criptografada, operação concreta, código bancário, status e conciliação"
              ],
              [
                "Ingresso do gateway",
                "Notificações v3 assinadas e verificação de operação autenticada"
              ],
              [
                "Suporte e notificações",
                "Perguntas, solicitações privadas, eventos e estado de leitura"
              ],
              [
                "Telegram",
                "Webhook de bot verificado"
              ],
              [
                "Rotas de dinheiro não suportadas",
                "O legado direto /api/payments e /api/payouts não cria uma cobrança nem um pagamento"
              ]
            ]
          },
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "support-example",
          "title": "Uma solicitação de conhecimento pública",
          "paragraphs": [
            "A resposta inclui mode, answer, sources, knowledgeVersion e needsHuman. Um Origin fornecido deve corresponder à origem do aplicativo. Um agente de documentação do lado do servidor pode omitir 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": "Erros e limites",
          "paragraphs": [
            "Um erro inclui um código legível por máquina e uma mensagem. Campos de solicitação desconhecidos são rejeitados. Corpos JSON padrão permitem 16.384 bytes; /api/support/ask e o webhook do Telegram permitem 65.536.",
            "429 indica um limite de taxa. 503 pode indicar uma integração indisponível, não um pagamento recusado. Leia error.code e não altere um status financeiro com base apenas no status HTTP."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Códigos de erro",
              "href": "/docs/errors"
            },
            {
              "label": "Especificação OpenAPI completa",
              "href": "/openapi.json"
            }
          ]
        },
        {
          "id": "stores-usd",
          "title": "Múltiplas lojas e um preço base em USD",
          "paragraphs": [
            "Escolha Todas as lojas para análises e operações agregadas, ou selecione uma loja para seus próprios registros. Cada loja tem um storeId separado, nome, padrão de IVA, faturas, chaves de API, endpoints de webhook, histórico de eventos e aplicativo de site. Notificações e tickets de suporte pertencem à conta. Uma conta pode criar até 100 lojas. Registros existentes permanecem na primeira loja.",
            "As faturas do novo workspace usam pricingMode=\"universal\" e um preço base em USD. O plano Any inclui cartão, alipay, sbp e cripto; um comerciante pode selecionar um subconjunto. Cartões e Alipay cobram em USD. O SBP cobra em RUB usando a taxa de referência USD/RUB do Banco da Rússia. Cripto cobra USDT sob a regra explícita de fatura 1 USD = 1 USDT. Esta é uma regra de conversão de fatura, não uma cotação de mercado de USDT. O gateway fornece a taxa da moeda selecionada, o valor exato da transferência e instruções antes da transferência.",
            "A taxa de referência e ambos os valores são congelados na criação. Faturas que envolvem conversão RUB expiram dentro de 24 horas. Se a taxa de referência não puder ser obtida, a criação falha com FX_UNAVAILABLE; nenhuma taxa de fallback inventada ou desatualizada é usada. O valor do proprietário em minor e cotações usam a moeda contábil USD. quotes[method].settlement contém a cotação de cobrança nativa. O checkout público expõe a moeda de cobrança selecionada em currency, o preço original em baseAmountMinor/baseCurrency, e a taxa de referência em fx. Uma vez que um pagamento foi enviado, seu método não pode ser alterado; uma fatura tem uma operação de gateway.",
            "Crie uma chave de API dentro da loja pretendida e envie Authorization: Bearer <key> do seu servidor. Seu vínculo de loja é imutável; X-Kevmi-Store não pode conceder acesso a outra loja. Sessões de navegador selecionam X-Kevmi-Store: <storeId>; omitir seleciona a primeira loja. O valor all é aceito apenas por GET /api/account/dashboard e GET /api/payment-links. Mutações exigem uma loja selecionada, Origin e X-CSRF-Token. IDs de conta e IDs de loja são identificadores diferentes.",
            "Para compatibilidade, solicitações de API sem pricingMode=\"universal\" mantêm preço nativo e as restrições originais de moeda. Faturas existentes nunca são recalculadas. Recibos confirmados nas análises refletem pagamentos verificados menos despesas de fatura salvas; eles não são um saldo sacável. Moedas de fatura legadas permanecem separadas e pagamentos são combinados com o suporte. Cumpra um pedido somente após verificar payment.fulfillmentReady=true e payment.status=\"succeeded\" através da API do servidor, histórico de eventos ou um webhook assinado."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": {
            "language": "json",
            "code": "{\n  \"pricingMode\": \"universal\",\n  \"title\": \"Order 1042\",\n  \"amountMinor\": 1000,\n  \"currency\": \"USD\",\n  \"methods\": [\n    \"card\",\n    \"alipay\",\n    \"sbp\",\n    \"crypto\"\n  ],\n  \"vatCustomerPercent\": 100,\n  \"feeCustomerPercent\": 0\n}"
          },
          "note": "",
          "links": []
        },
        {
          "id": "assistant-admin-v16",
          "title": "Assistente, suporte e administração de projetos",
          "paragraphs": [
            "Um primeiro login pelo Telegram cria uma conta e uma loja rascunho com status not_submitted, não um comerciante aprovado. A conta abre o formulário de inscrição para revisão atual; aceitar pagamentos requer aprovação de especialista. Cada nova loja tem sua própria revisão. GET /api/stores retorna reviewStatus e applicationId. Lojas conectadas mantêm acesso agregado, e suporte e documentação permanecem disponíveis durante a revisão.",
            "Ativar Permitir acesso aos meus dados no chat quando precisar de ajuda com operações privadas. Uma solicitação da web com includeAccount=true exige uma sessão válida, Origin e X-CSRF-Token; X-Kevmi-Store seleciona uma loja própria ou todas as lojas próprias. Sem permissão, o assistente usa documentação pública. No Telegram, um botão separado permite o acesso depois que o remetente for identificado.",
            "A ferramenta read_account lê lojas próprias, faturas com status de recebimento verificado, eventos, aplicativos e solicitações de suporte com respostas de especialistas. Ela retorna 30 registros e nextPage; registros mais antigos estão disponíveis por paginação. As leituras por resposta são limitadas, portanto uma amostra incompleta deve ser divulgada. Chaves de API, segredos de webhook, detalhes de cartão e sessões não são fornecidos à ferramenta. Ela não pode cobrar, pagar, reembolsar ou alterar configurações.",
            "Criar uma solicitação de suporte no espaço de trabalho ou no Telegram coloca um alerta separado de administrador em uma fila durável. Ela vincula a /admin/tickets?ticket=<id>; falhas temporárias do Telegram são repetidas. A recuperação também pega solicitações abertas mais antigas sem alerta. Os administradores respondem na página da solicitação; a resposta é salva no espaço de trabalho do usuário e enviada pelo Telegram quando as notificações de suporte estão ativadas.",
            "O bot usa botões em linha para o menu principal, lojas, notificações, suporte, segurança e idioma. A navegação edita a mensagem atual; um menu antigo indisponível é substituído. Notificações de pagamento e segurança não são tratadas como navegação descartável. Sair pelo menu exige confirmação. O comando explícito /logout ainda encerra todas as sessões da conta.",
            "O painel /admin/project é restrito a IDs do Telegram na lista de permissão MODERATOR_TELEGRAM_IDS no lado do servidor. Inclui usuários, lojas, operações, revogação de chaves, desativação de webhooks, pausa de faturas, controles de aceitação e um registro de auditoria. Mutações exigem CSRF e um motivo. O painel não pode restringir um administrador nem declarar manualmente um pagamento como bem-sucedido. Restringir um proprietário encerra sessões e bloqueia o acesso a chaves de API; restringir uma loja interrompe novas operações. O histórico é mantido.",
            "A oferta pública está disponível em /public-offer e a política de privacidade em /privacy-policy em todos os idiomas habilitados. Pesquise moedas por nome ou ticker. Um seletor de rede aparece somente quando várias redes ativas estão disponíveis. Uma única rede é selecionada automaticamente e permanece nomeada na confirmação. A disponibilidade ao vivo do gateway determina os pares selecionáveis; o catálogo de referência não habilita um serviço.",
            "Use update.sh para lançamentos de rotina do app da web: compile o candidato, verifique o histórico de migrações, faça backup do SQLite online, inicie um segundo contêiner, verifique-o e alterne o Caddy sem interrupção. Gateway, PostgreSQL e e-mail não são reiniciados. Ativos estáticos anteriores permanecem disponíveis para abas abertas. Uma nova migração exige autorização revisada explícita; uma mudança incompatível de esquema não é uma implantação sem interrupção."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Oferta pública",
              "href": "/public-offer"
            },
            {
              "label": "Política de privacidade",
              "href": "/privacy-policy"
            }
          ]
        }
      ],
      "body": "URL base e formato\n\nA URL base é https://kevmi.one. Corpos de solicitação e resposta usam JSON. Valores monetários são unidades menores inteiras. Datas de conta e suporte são timestamps Unix em milissegundos.\n\nRespostas da API usam Cache-Control: no-store. O /openapi.json público pode ser armazenado em cache por cinco minutos. Não coloque cookies ou segredos em uma URL.\n\ncurl 'https://kevmi.one/api/config'\n\ncurl 'https://kevmi.one/openapi.json'\n\nAutorização de solicitação\n\nA conta web usa um cookie de sessão HttpOnly. GET /api/auth/me retorna o usuário atual e csrfToken. Mutações exigem X-CSRF-Token e uma solicitação de mesma origem.\n\nChaves de comerciante Kevmi com escopo autorizam /api/v1/payments, /api/v1/payment-links e /api/v1/events. Elas não substituem o cookie de sessão para configurações de conta ou rotas administrativas.\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\nGrupos de endpoints\n\nGET /api/config informa a presença da configuração do servidor. GET /api/checkout/{token} retorna invoice.availability para o método selecionado, incluindo aprovação do comerciante e termos salvos. Essas verificações não estabelecem conectividade do provedor nem sucesso do pagamento: o resultado vem da operação verificada do gateway.\n\nGrupo · Finalidade\nConfiguração e saúde · Prontidão do serviço público e de armazenamento\nAutenticação · Desafios e sessões do Telegram\nConta · Configurações e o aplicativo privado do comerciante\n/api/v1/payments · Criação e leitura de faturas de servidor com escopo; não inicia uma cobrança\n/api/v1/events · Registro de eventos do servidor com events:read\nIntegrações · Administração de chaves e endpoints de webhook autenticados por sessão\nAplicativos e moderação · Envios de propriedade, acompanhamento de status e permissões separadas de moderador\nCheckout · Fatura pública, solicitação de cartão criptografada, operação concreta, código bancário, status e conciliação\nIngresso do gateway · Notificações v3 assinadas e verificação de operação autenticada\nSuporte e notificações · Perguntas, solicitações privadas, eventos e estado de leitura\nTelegram · Webhook de bot verificado\nRotas de dinheiro não suportadas · O legado direto /api/payments e /api/payouts não cria uma cobrança nem um pagamento\n\nUma solicitação de conhecimento pública\n\nA resposta inclui mode, answer, sources, knowledgeVersion e needsHuman. Um Origin fornecido deve corresponder à origem do aplicativo. Um agente de documentação do lado do servidor pode omitir Origin.\n\ncurl 'https://kevmi.one/api/support/ask' \\\n  -H 'Content-Type: application/json' \\\n  --data '{\"question\":\"Who pays VAT?\",\"locale\":\"en\"}'\n\nErros e limites\n\nUm erro inclui um código legível por máquina e uma mensagem. Campos de solicitação desconhecidos são rejeitados. Corpos JSON padrão permitem 16.384 bytes; /api/support/ask e o webhook do Telegram permitem 65.536.\n\n429 indica um limite de taxa. 503 pode indicar uma integração indisponível, não um pagamento recusado. Leia error.code e não altere um status financeiro com base apenas no status HTTP.\n\nCódigos de erro\n\nEspecificação OpenAPI completa\n\nMúltiplas lojas e um preço base em USD\n\nEscolha Todas as lojas para análises e operações agregadas, ou selecione uma loja para seus próprios registros. Cada loja tem um storeId separado, nome, padrão de IVA, faturas, chaves de API, endpoints de webhook, histórico de eventos e aplicativo de site. Notificações e tickets de suporte pertencem à conta. Uma conta pode criar até 100 lojas. Registros existentes permanecem na primeira loja.\n\nAs faturas do novo workspace usam pricingMode=\"universal\" e um preço base em USD. O plano Any inclui cartão, alipay, sbp e cripto; um comerciante pode selecionar um subconjunto. Cartões e Alipay cobram em USD. O SBP cobra em RUB usando a taxa de referência USD/RUB do Banco da Rússia. Cripto cobra USDT sob a regra explícita de fatura 1 USD = 1 USDT. Esta é uma regra de conversão de fatura, não uma cotação de mercado de USDT. O gateway fornece a taxa da moeda selecionada, o valor exato da transferência e instruções antes da transferência.\n\nA taxa de referência e ambos os valores são congelados na criação. Faturas que envolvem conversão RUB expiram dentro de 24 horas. Se a taxa de referência não puder ser obtida, a criação falha com FX_UNAVAILABLE; nenhuma taxa de fallback inventada ou desatualizada é usada. O valor do proprietário em minor e cotações usam a moeda contábil USD. quotes[method].settlement contém a cotação de cobrança nativa. O checkout público expõe a moeda de cobrança selecionada em currency, o preço original em baseAmountMinor/baseCurrency, e a taxa de referência em fx. Uma vez que um pagamento foi enviado, seu método não pode ser alterado; uma fatura tem uma operação de gateway.\n\nCrie uma chave de API dentro da loja pretendida e envie Authorization: Bearer <key> do seu servidor. Seu vínculo de loja é imutável; X-Kevmi-Store não pode conceder acesso a outra loja. Sessões de navegador selecionam X-Kevmi-Store: <storeId>; omitir seleciona a primeira loja. O valor all é aceito apenas por GET /api/account/dashboard e GET /api/payment-links. Mutações exigem uma loja selecionada, Origin e X-CSRF-Token. IDs de conta e IDs de loja são identificadores diferentes.\n\nPara compatibilidade, solicitações de API sem pricingMode=\"universal\" mantêm preço nativo e as restrições originais de moeda. Faturas existentes nunca são recalculadas. Recibos confirmados nas análises refletem pagamentos verificados menos despesas de fatura salvas; eles não são um saldo sacável. Moedas de fatura legadas permanecem separadas e pagamentos são combinados com o suporte. Cumpra um pedido somente após verificar payment.fulfillmentReady=true e payment.status=\"succeeded\" através da API do servidor, histórico de eventos ou um webhook assinado.\n\n{\n  \"pricingMode\": \"universal\",\n  \"title\": \"Order 1042\",\n  \"amountMinor\": 1000,\n  \"currency\": \"USD\",\n  \"methods\": [\n    \"card\",\n    \"alipay\",\n    \"sbp\",\n    \"crypto\"\n  ],\n  \"vatCustomerPercent\": 100,\n  \"feeCustomerPercent\": 0\n}\n\nAssistente, suporte e administração de projetos\n\nUm primeiro login pelo Telegram cria uma conta e uma loja rascunho com status not_submitted, não um comerciante aprovado. A conta abre o formulário de inscrição para revisão atual; aceitar pagamentos requer aprovação de especialista. Cada nova loja tem sua própria revisão. GET /api/stores retorna reviewStatus e applicationId. Lojas conectadas mantêm acesso agregado, e suporte e documentação permanecem disponíveis durante a revisão.\n\nAtivar Permitir acesso aos meus dados no chat quando precisar de ajuda com operações privadas. Uma solicitação da web com includeAccount=true exige uma sessão válida, Origin e X-CSRF-Token; X-Kevmi-Store seleciona uma loja própria ou todas as lojas próprias. Sem permissão, o assistente usa documentação pública. No Telegram, um botão separado permite o acesso depois que o remetente for identificado.\n\nA ferramenta read_account lê lojas próprias, faturas com status de recebimento verificado, eventos, aplicativos e solicitações de suporte com respostas de especialistas. Ela retorna 30 registros e nextPage; registros mais antigos estão disponíveis por paginação. As leituras por resposta são limitadas, portanto uma amostra incompleta deve ser divulgada. Chaves de API, segredos de webhook, detalhes de cartão e sessões não são fornecidos à ferramenta. Ela não pode cobrar, pagar, reembolsar ou alterar configurações.\n\nCriar uma solicitação de suporte no espaço de trabalho ou no Telegram coloca um alerta separado de administrador em uma fila durável. Ela vincula a /admin/tickets?ticket=<id>; falhas temporárias do Telegram são repetidas. A recuperação também pega solicitações abertas mais antigas sem alerta. Os administradores respondem na página da solicitação; a resposta é salva no espaço de trabalho do usuário e enviada pelo Telegram quando as notificações de suporte estão ativadas.\n\nO bot usa botões em linha para o menu principal, lojas, notificações, suporte, segurança e idioma. A navegação edita a mensagem atual; um menu antigo indisponível é substituído. Notificações de pagamento e segurança não são tratadas como navegação descartável. Sair pelo menu exige confirmação. O comando explícito /logout ainda encerra todas as sessões da conta.\n\nO painel /admin/project é restrito a IDs do Telegram na lista de permissão MODERATOR_TELEGRAM_IDS no lado do servidor. Inclui usuários, lojas, operações, revogação de chaves, desativação de webhooks, pausa de faturas, controles de aceitação e um registro de auditoria. Mutações exigem CSRF e um motivo. O painel não pode restringir um administrador nem declarar manualmente um pagamento como bem-sucedido. Restringir um proprietário encerra sessões e bloqueia o acesso a chaves de API; restringir uma loja interrompe novas operações. O histórico é mantido.\n\nA oferta pública está disponível em /public-offer e a política de privacidade em /privacy-policy em todos os idiomas habilitados. Pesquise moedas por nome ou ticker. Um seletor de rede aparece somente quando várias redes ativas estão disponíveis. Uma única rede é selecionada automaticamente e permanece nomeada na confirmação. A disponibilidade ao vivo do gateway determina os pares selecionáveis; o catálogo de referência não habilita um serviço.\n\nUse update.sh para lançamentos de rotina do app da web: compile o candidato, verifique o histórico de migrações, faça backup do SQLite online, inicie um segundo contêiner, verifique-o e alterne o Caddy sem interrupção. Gateway, PostgreSQL e e-mail não são reiniciados. Ativos estáticos anteriores permanecem disponíveis para abas abertas. Uma nova migração exige autorização revisada explícita; uma mudança incompatível de esquema não é uma implantação sem interrupção.\n\nOferta pública\n\nPolítica de privacidade",
      "readMinutes": 4
    },
    {
      "id": "payment-links-api",
      "title": "API de links de pagamento e chaves de API",
      "summary": "Crie uma fatura a partir do seu backend e receba checkoutUrl imediatamente. A API suporta chaves com escopo, novas tentativas idempotentes, parcelas independentes de taxa e IVA, uma referência de pedido e metadados privados.",
      "tags": [
        "API",
        "link de pagamento",
        "idempotência",
        "checkout",
        "paginação",
        "chave de API",
        "escopo",
        "metadados"
      ],
      "sections": [
        {
          "id": "create",
          "title": "Uma solicitação de servidor retorna um link pronto",
          "paragraphs": [
            "POST /api/v1/payments e /api/v1/payment-links criam o mesmo tipo de fatura. O nome da rota payments não implica uma cobrança: o resultado são termos de fatura persistidos e um checkoutUrl para o cliente.",
            "Envie Authorization: Bearer <key>, Content-Type: application/json e Idempotency-Key. As chaves de idempotência contêm 16–100 letras, dígitos, hífens ou sublinhados. Persista uma chave para cada criação lógica de pedido."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": {
            "language": "cURL · server only",
            "code": "curl 'https://kevmi.one/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 '{\"pricingMode\":\"universal\",\"title\":\"Design project · order 1042\",\"description\":\"One-time payment for the agreed design work\",\"amountMinor\":500,\"currency\":\"USD\",\"methods\":[\"card\",\"alipay\",\"sbp\",\"crypto\"],\"vatCustomerPercent\":100,\"feeCustomerPercent\":0,\"orderId\":\"order-1042\",\"metadata\":{\"campaign\":\"autumn\"}}'"
          },
          "note": "A resposta contém link, checkoutUrl e replayed. Passe checkoutUrl para o cliente ou widget; mantenha a chave de API no seu servidor.",
          "links": []
        },
        {
          "id": "keys",
          "title": "Escopos e expiração de chaves de API",
          "paragraphs": [
            "Crie uma chave em /account#keys na sua conta de comerciante verificada. O valor completo aparece uma única vez; apenas um hash é armazenado. As chaves duram 90 dias por padrão, com uma vida útil permitida de 1–365 dias e até dez chaves ativas por conta.",
            "Conceda apenas os escopos necessários. Revogação ou expiração interrompe o acesso. Uma chave não substitui a sessão do navegador para configurações de conta, administração de endpoints, aplicativos ou moderação. Mantenha-a fora de widgets, URLs, repositórios públicos e mensagens de suporte.",
            "O site usa /api/payment-links com seu cookie de sessão, Origin exato e X-CSRF-Token. Essas rotas operam nas mesmas faturas de propriedade da conta."
          ],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Escopo",
              "Finalidade"
            ],
            "rows": [
              [
                "invoices:read",
                "Ler faturas próprias e sua lista"
              ],
              [
                "invoices:write",
                "Criar faturas e alterar a disponibilidade do link"
              ],
              [
                "events:read",
                "Ler o registro de eventos do servidor"
              ]
            ]
          },
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Chaves de API na sua conta",
              "href": "/account#keys"
            }
          ]
        },
        {
          "id": "methods",
          "title": "Any e métodos de API concretos",
          "paragraphs": [
            "For legacy native pricing, 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.",
            "As faturas do novo workspace usam pricingMode=\"universal\" e um preço base em USD. O plano Any inclui cartão, alipay, sbp e cripto; um comerciante pode selecionar um subconjunto. Cartões e Alipay cobram em USD. O SBP cobra em RUB usando a taxa de referência USD/RUB do Banco da Rússia. Cripto cobra USDT sob a regra explícita de fatura 1 USD = 1 USDT. Esta é uma regra de conversão de fatura, não uma cotação de mercado de USDT. O gateway fornece a taxa da moeda selecionada, o valor exato da transferência e instruções antes da transferência.",
            "Para um novo pagamento ao vivo com cartão ou Alipay, o gateway atual suporta apenas feeCustomerPercent=0 e vatCustomerPercent=100: o comerciante cobre toda a taxa de processamento e o IVA é adicionado integralmente para o cliente. Outras parcelas podem ser salvas e calculadas em uma fatura, mas a execução é bloqueada com unsupported_allocation. O servidor nunca altera silenciosamente os termos salvos. Pagamentos SBP e USDT cripto suportam todas as parcelas de taxa de processamento e não têm IVA."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Any na interface da conta",
              "href": "/docs/payment-links#any"
            },
            {
              "label": "Checkout",
              "href": "/docs/checkout"
            }
          ]
        },
        {
          "id": "snapshot",
          "title": "Campos e termos persistidos",
          "paragraphs": [
            "A fatura salva o nome do comerciante, preço, moeda, métodos, ambas as participações de custo e cotações calculadas. Metadados são retornados ao proprietário e em eventos de servidor, mas não por meio do checkout público. Não armazene segredos de pagamento neles.",
            "Se as participações forem omitidas, o comerciante cobre a taxa; o IVA herda vatPayer ou a configuração da conta. Uma alocação parcial pode retornar vatPayer=shared. O título, orderId e descrição são públicos."
          ],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Campo",
              "Regra"
            ],
            "rows": [
              [
                "title / description",
                "1–120 / 0–500 caracteres"
              ],
              [
                "amountMinor",
                "Inteiro 1–10.000.000.000; 500 significa $5,00 em USD"
              ],
              [
                "currency / methods",
                "USD: card, alipay; RUB: sbp; USDT: crypto. Lista única não vazia."
              ],
              [
                "vatCustomerPercent / feeCustomerPercent",
                "Participações inteiras independentes do cliente de 0 a 100"
              ],
              [
                "vatPayer",
                "Legado customer ou merchant; não pode conflitar com a participação de IVA"
              ],
              [
                "orderId",
                "Opcional, até 100 caracteres; visível ao cliente"
              ],
              [
                "metadados",
                "Até dez entradas de string; chave de 1–40 letras/dígitos/_/-; valor até 500 caracteres; total até 3000 bytes UTF-8"
              ],
              [
                "expiresAt",
                "Milissegundos Unix futuros dentro de 90 dias; sete dias por padrão"
              ]
            ]
          },
          "code": null,
          "note": "As faturas do novo workspace usam pricingMode=\"universal\" e um preço base em USD. O plano Any inclui cartão, alipay, sbp e cripto; um comerciante pode selecionar um subconjunto. Cartões e Alipay cobram em USD. O SBP cobra em RUB usando a taxa de referência USD/RUB do Banco da Rússia. Cripto cobra USDT sob a regra explícita de fatura 1 USD = 1 USDT. Esta é uma regra de conversão de fatura, não uma cotação de mercado de USDT. O gateway fornece a taxa da moeda selecionada, o valor exato da transferência e instruções antes da transferência.",
          "links": [
            {
              "label": "Fórmulas de alocação de custo",
              "href": "/docs/cost-sharing"
            }
          ]
        },
        {
          "id": "idempotency",
          "title": "Tente novamente após um erro de rede",
          "paragraphs": [
            "A criação inicial retorna 201 com replayed=false. A mesma chave e corpo canônico retornam 200, o checkoutUrl original e replayed=true. Uma solicitação diferente sob essa chave retorna 409 IDEMPOTENCY_CONFLICT.",
            "Não gere outra chave após um tempo limite. Repita a solicitação original com campos idênticos. Valores omitidos não herdam novamente configurações alteradas. orderId ajuda a correlacionar um pedido, mas não substitui Idempotency-Key e não precisa ser único no armazenamento."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "read",
          "title": "Leitura e paginação",
          "paragraphs": [
            "GET /api/v1/payments retorna links e nextCursor; GET /api/v1/payments/{id} retorna um link próprio. invoices:read é obrigatório. O tamanho padrão da página é 30; limit aceita 1–100.",
            "As respostas de GET lista e detalhe incluem link.payment: um resumo da operação relacionada, ou null quando não existe operação. As respostas de POST/PATCH podem omiti-lo; leia a fatura novamente quando precisar do resumo. O status do link descreve separadamente se um novo pagamento pode começar. Campos de cartão e chaves privadas nunca são incluídos.",
            "Passe nextCursor sem alterações por URLSearchParams. null marca o fim; IDs desconhecidos e de outros comerciantes retornam 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": "Pausar, retomar e cancelar",
          "paragraphs": [
            "PATCH /api/v1/payments/{id} com invoices:write aceita apenas {\"status\":\"active\"}, {\"status\":\"paused\"} ou {\"status\":\"cancelled\"}. O cancelamento é definitivo. expired é derivado do tempo de expiração; uma fatura expirada não pode ser estendida.",
            "Preço, participações de custo, descrição, orderId, metadados e expiração são imutáveis. Crie outra fatura para termos diferentes. Alterar a disponibilidade emite invoice.updated, não um evento de pagamento bem-sucedido."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "buyer",
          "title": "A resposta do cliente",
          "paragraphs": [
            "GET /api/checkout/{token}?method=card retorna a fatura pública, cotação, disponibilidade de método e operação existente. Metadados, segredos e saldos do proprietário não são expostos.",
            "POST /api/checkout/{token}/pay exige o Origin do site e um método concreto. Dados de cartão são aceitos apenas como lacrados: {intent,jwe}, depois que o navegador obtém /card-intent. Códigos bancários são criptografados e enviados por /code. Crypto usa uma fatura USDT salva e um par moeda/rede disponível.",
            "Um novo pagamento e uma intenção de cartão exigem que a solicitação mais recente de revisão do site do comerciante seja aprovada. A aprovação por si só não conecta o gateway de pagamento. Se a revisão mudar após o envio, a operação existente permanece disponível para leitura de status, conciliação e um código bancário solicitado.",
            "Uma conexão ao vivo ausente retorna GATEWAY_NOT_CONNECTED; uma alocação incompatível nunca é substituída por outro cálculo. Status e reconcile leem a operação original sem uma cobrança duplicada."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Widget de checkout",
              "href": "/docs/widgets"
            },
            {
              "label": "Confirmar pagamento com webhooks",
              "href": "/docs/webhooks"
            }
          ]
        },
        {
          "id": "stores-usd",
          "title": "Múltiplas lojas e um preço base em USD",
          "paragraphs": [
            "Escolha Todas as lojas para análises e operações agregadas, ou selecione uma loja para seus próprios registros. Cada loja tem um storeId separado, nome, padrão de IVA, faturas, chaves de API, endpoints de webhook, histórico de eventos e aplicativo de site. Notificações e tickets de suporte pertencem à conta. Uma conta pode criar até 100 lojas. Registros existentes permanecem na primeira loja.",
            "As faturas do novo workspace usam pricingMode=\"universal\" e um preço base em USD. O plano Any inclui cartão, alipay, sbp e cripto; um comerciante pode selecionar um subconjunto. Cartões e Alipay cobram em USD. O SBP cobra em RUB usando a taxa de referência USD/RUB do Banco da Rússia. Cripto cobra USDT sob a regra explícita de fatura 1 USD = 1 USDT. Esta é uma regra de conversão de fatura, não uma cotação de mercado de USDT. O gateway fornece a taxa da moeda selecionada, o valor exato da transferência e instruções antes da transferência.",
            "A taxa de referência e ambos os valores são congelados na criação. Faturas que envolvem conversão RUB expiram dentro de 24 horas. Se a taxa de referência não puder ser obtida, a criação falha com FX_UNAVAILABLE; nenhuma taxa de fallback inventada ou desatualizada é usada. O valor do proprietário em minor e cotações usam a moeda contábil USD. quotes[method].settlement contém a cotação de cobrança nativa. O checkout público expõe a moeda de cobrança selecionada em currency, o preço original em baseAmountMinor/baseCurrency, e a taxa de referência em fx. Uma vez que um pagamento foi enviado, seu método não pode ser alterado; uma fatura tem uma operação de gateway.",
            "Crie uma chave de API dentro da loja pretendida e envie Authorization: Bearer <key> do seu servidor. Seu vínculo de loja é imutável; X-Kevmi-Store não pode conceder acesso a outra loja. Sessões de navegador selecionam X-Kevmi-Store: <storeId>; omitir seleciona a primeira loja. O valor all é aceito apenas por GET /api/account/dashboard e GET /api/payment-links. Mutações exigem uma loja selecionada, Origin e X-CSRF-Token. IDs de conta e IDs de loja são identificadores diferentes.",
            "Para compatibilidade, solicitações de API sem pricingMode=\"universal\" mantêm preço nativo e as restrições originais de moeda. Faturas existentes nunca são recalculadas. Recibos confirmados nas análises refletem pagamentos verificados menos despesas de fatura salvas; eles não são um saldo sacável. Moedas de fatura legadas permanecem separadas e pagamentos são combinados com o suporte. Cumpra um pedido somente após verificar payment.fulfillmentReady=true e payment.status=\"succeeded\" através da API do servidor, histórico de eventos ou um webhook assinado."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        }
      ],
      "group": "developers",
      "url": "/docs/payment-links-api",
      "body": "Uma solicitação de servidor retorna um link pronto\n\nPOST /api/v1/payments e /api/v1/payment-links criam o mesmo tipo de fatura. O nome da rota payments não implica uma cobrança: o resultado são termos de fatura persistidos e um checkoutUrl para o cliente.\n\nEnvie Authorization: Bearer <key>, Content-Type: application/json e Idempotency-Key. As chaves de idempotência contêm 16–100 letras, dígitos, hífens ou sublinhados. Persista uma chave para cada criação lógica de pedido.\n\ncurl 'https://kevmi.one/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 '{\"pricingMode\":\"universal\",\"title\":\"Design project · order 1042\",\"description\":\"One-time payment for the agreed design work\",\"amountMinor\":500,\"currency\":\"USD\",\"methods\":[\"card\",\"alipay\",\"sbp\",\"crypto\"],\"vatCustomerPercent\":100,\"feeCustomerPercent\":0,\"orderId\":\"order-1042\",\"metadata\":{\"campaign\":\"autumn\"}}'\n\nA resposta contém link, checkoutUrl e replayed. Passe checkoutUrl para o cliente ou widget; mantenha a chave de API no seu servidor.\n\nEscopos e expiração de chaves de API\n\nCrie uma chave em /account#keys na sua conta de comerciante verificada. O valor completo aparece uma única vez; apenas um hash é armazenado. As chaves duram 90 dias por padrão, com uma vida útil permitida de 1–365 dias e até dez chaves ativas por conta.\n\nConceda apenas os escopos necessários. Revogação ou expiração interrompe o acesso. Uma chave não substitui a sessão do navegador para configurações de conta, administração de endpoints, aplicativos ou moderação. Mantenha-a fora de widgets, URLs, repositórios públicos e mensagens de suporte.\n\nO site usa /api/payment-links com seu cookie de sessão, Origin exato e X-CSRF-Token. Essas rotas operam nas mesmas faturas de propriedade da conta.\n\nEscopo · Finalidade\ninvoices:read · Ler faturas próprias e sua lista\ninvoices:write · Criar faturas e alterar a disponibilidade do link\nevents:read · Ler o registro de eventos do servidor\n\nChaves de API na sua conta\n\nAny e métodos de API concretos\n\nFor legacy native pricing, 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\nAs faturas do novo workspace usam pricingMode=\"universal\" e um preço base em USD. O plano Any inclui cartão, alipay, sbp e cripto; um comerciante pode selecionar um subconjunto. Cartões e Alipay cobram em USD. O SBP cobra em RUB usando a taxa de referência USD/RUB do Banco da Rússia. Cripto cobra USDT sob a regra explícita de fatura 1 USD = 1 USDT. Esta é uma regra de conversão de fatura, não uma cotação de mercado de USDT. O gateway fornece a taxa da moeda selecionada, o valor exato da transferência e instruções antes da transferência.\n\nPara um novo pagamento ao vivo com cartão ou Alipay, o gateway atual suporta apenas feeCustomerPercent=0 e vatCustomerPercent=100: o comerciante cobre toda a taxa de processamento e o IVA é adicionado integralmente para o cliente. Outras parcelas podem ser salvas e calculadas em uma fatura, mas a execução é bloqueada com unsupported_allocation. O servidor nunca altera silenciosamente os termos salvos. Pagamentos SBP e USDT cripto suportam todas as parcelas de taxa de processamento e não têm IVA.\n\nAny na interface da conta\n\nCheckout\n\nCampos e termos persistidos\n\nA fatura salva o nome do comerciante, preço, moeda, métodos, ambas as participações de custo e cotações calculadas. Metadados são retornados ao proprietário e em eventos de servidor, mas não por meio do checkout público. Não armazene segredos de pagamento neles.\n\nSe as participações forem omitidas, o comerciante cobre a taxa; o IVA herda vatPayer ou a configuração da conta. Uma alocação parcial pode retornar vatPayer=shared. O título, orderId e descrição são públicos.\n\nCampo · Regra\ntitle / description · 1–120 / 0–500 caracteres\namountMinor · Inteiro 1–10.000.000.000; 500 significa $5,00 em USD\ncurrency / methods · USD: card, alipay; RUB: sbp; USDT: crypto. Lista única não vazia.\nvatCustomerPercent / feeCustomerPercent · Participações inteiras independentes do cliente de 0 a 100\nvatPayer · Legado customer ou merchant; não pode conflitar com a participação de IVA\norderId · Opcional, até 100 caracteres; visível ao cliente\nmetadados · Até dez entradas de string; chave de 1–40 letras/dígitos/_/-; valor até 500 caracteres; total até 3000 bytes UTF-8\nexpiresAt · Milissegundos Unix futuros dentro de 90 dias; sete dias por padrão\n\nAs faturas do novo workspace usam pricingMode=\"universal\" e um preço base em USD. O plano Any inclui cartão, alipay, sbp e cripto; um comerciante pode selecionar um subconjunto. Cartões e Alipay cobram em USD. O SBP cobra em RUB usando a taxa de referência USD/RUB do Banco da Rússia. Cripto cobra USDT sob a regra explícita de fatura 1 USD = 1 USDT. Esta é uma regra de conversão de fatura, não uma cotação de mercado de USDT. O gateway fornece a taxa da moeda selecionada, o valor exato da transferência e instruções antes da transferência.\n\nFórmulas de alocação de custo\n\nTente novamente após um erro de rede\n\nA criação inicial retorna 201 com replayed=false. A mesma chave e corpo canônico retornam 200, o checkoutUrl original e replayed=true. Uma solicitação diferente sob essa chave retorna 409 IDEMPOTENCY_CONFLICT.\n\nNão gere outra chave após um tempo limite. Repita a solicitação original com campos idênticos. Valores omitidos não herdam novamente configurações alteradas. orderId ajuda a correlacionar um pedido, mas não substitui Idempotency-Key e não precisa ser único no armazenamento.\n\nLeitura e paginação\n\nGET /api/v1/payments retorna links e nextCursor; GET /api/v1/payments/{id} retorna um link próprio. invoices:read é obrigatório. O tamanho padrão da página é 30; limit aceita 1–100.\n\nAs respostas de GET lista e detalhe incluem link.payment: um resumo da operação relacionada, ou null quando não existe operação. As respostas de POST/PATCH podem omiti-lo; leia a fatura novamente quando precisar do resumo. O status do link descreve separadamente se um novo pagamento pode começar. Campos de cartão e chaves privadas nunca são incluídos.\n\nPasse nextCursor sem alterações por URLSearchParams. null marca o fim; IDs desconhecidos e de outros comerciantes retornam 404.\n\nGET /api/v1/payments?limit=30\nAuthorization: Bearer <server-side key>\n\nPausar, retomar e cancelar\n\nPATCH /api/v1/payments/{id} com invoices:write aceita apenas {\"status\":\"active\"}, {\"status\":\"paused\"} ou {\"status\":\"cancelled\"}. O cancelamento é definitivo. expired é derivado do tempo de expiração; uma fatura expirada não pode ser estendida.\n\nPreço, participações de custo, descrição, orderId, metadados e expiração são imutáveis. Crie outra fatura para termos diferentes. Alterar a disponibilidade emite invoice.updated, não um evento de pagamento bem-sucedido.\n\nA resposta do cliente\n\nGET /api/checkout/{token}?method=card retorna a fatura pública, cotação, disponibilidade de método e operação existente. Metadados, segredos e saldos do proprietário não são expostos.\n\nPOST /api/checkout/{token}/pay exige o Origin do site e um método concreto. Dados de cartão são aceitos apenas como lacrados: {intent,jwe}, depois que o navegador obtém /card-intent. Códigos bancários são criptografados e enviados por /code. Crypto usa uma fatura USDT salva e um par moeda/rede disponível.\n\nUm novo pagamento e uma intenção de cartão exigem que a solicitação mais recente de revisão do site do comerciante seja aprovada. A aprovação por si só não conecta o gateway de pagamento. Se a revisão mudar após o envio, a operação existente permanece disponível para leitura de status, conciliação e um código bancário solicitado.\n\nUma conexão ao vivo ausente retorna GATEWAY_NOT_CONNECTED; uma alocação incompatível nunca é substituída por outro cálculo. Status e reconcile leem a operação original sem uma cobrança duplicada.\n\nWidget de checkout\n\nConfirmar pagamento com webhooks\n\nMúltiplas lojas e um preço base em USD\n\nEscolha Todas as lojas para análises e operações agregadas, ou selecione uma loja para seus próprios registros. Cada loja tem um storeId separado, nome, padrão de IVA, faturas, chaves de API, endpoints de webhook, histórico de eventos e aplicativo de site. Notificações e tickets de suporte pertencem à conta. Uma conta pode criar até 100 lojas. Registros existentes permanecem na primeira loja.\n\nAs faturas do novo workspace usam pricingMode=\"universal\" e um preço base em USD. O plano Any inclui cartão, alipay, sbp e cripto; um comerciante pode selecionar um subconjunto. Cartões e Alipay cobram em USD. O SBP cobra em RUB usando a taxa de referência USD/RUB do Banco da Rússia. Cripto cobra USDT sob a regra explícita de fatura 1 USD = 1 USDT. Esta é uma regra de conversão de fatura, não uma cotação de mercado de USDT. O gateway fornece a taxa da moeda selecionada, o valor exato da transferência e instruções antes da transferência.\n\nA taxa de referência e ambos os valores são congelados na criação. Faturas que envolvem conversão RUB expiram dentro de 24 horas. Se a taxa de referência não puder ser obtida, a criação falha com FX_UNAVAILABLE; nenhuma taxa de fallback inventada ou desatualizada é usada. O valor do proprietário em minor e cotações usam a moeda contábil USD. quotes[method].settlement contém a cotação de cobrança nativa. O checkout público expõe a moeda de cobrança selecionada em currency, o preço original em baseAmountMinor/baseCurrency, e a taxa de referência em fx. Uma vez que um pagamento foi enviado, seu método não pode ser alterado; uma fatura tem uma operação de gateway.\n\nCrie uma chave de API dentro da loja pretendida e envie Authorization: Bearer <key> do seu servidor. Seu vínculo de loja é imutável; X-Kevmi-Store não pode conceder acesso a outra loja. Sessões de navegador selecionam X-Kevmi-Store: <storeId>; omitir seleciona a primeira loja. O valor all é aceito apenas por GET /api/account/dashboard e GET /api/payment-links. Mutações exigem uma loja selecionada, Origin e X-CSRF-Token. IDs de conta e IDs de loja são identificadores diferentes.\n\nPara compatibilidade, solicitações de API sem pricingMode=\"universal\" mantêm preço nativo e as restrições originais de moeda. Faturas existentes nunca são recalculadas. Recibos confirmados nas análises refletem pagamentos verificados menos despesas de fatura salvas; eles não são um saldo sacável. Moedas de fatura legadas permanecem separadas e pagamentos são combinados com o suporte. Cumpra um pedido somente após verificar payment.fulfillmentReady=true e payment.status=\"succeeded\" através da API do servidor, histórico de eventos ou um webhook assinado.",
      "readMinutes": 8
    },
    {
      "id": "auth-api",
      "title": "API de autenticação e sessão",
      "summary": "O login usa um desafio de curta duração, confirmação por Telegram e prova de controle do navegador original. Um ID do Telegram fornecido pelo cliente não é prova de identidade.",
      "group": "developers",
      "url": "/docs/auth-api",
      "tags": [
        "autenticação",
        "sessão",
        "CSRF",
        "desafio",
        "API"
      ],
      "sections": [
        {
          "id": "start",
          "title": "Iniciando login",
          "paragraphs": [
            "POST /api/auth/telegram/start aceita um objeto JSON vazio {}. Exige a Origin exata do aplicativo e um bot disponível. O servidor cria um desafio com duração de 300 segundos e um cookie protegido de prova do navegador.",
            "A resposta 201 contém challengeId, code, expiresAt e telegramUrl. O cookie de prova é excluído do link profundo e é inacessível ao JavaScript. O limite é de seis inícios por minuto por endereço com hash."
          ],
          "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": "Aguardando confirmação",
          "paragraphs": [
            "POST /api/auth/telegram/complete aceita {challengeId}. Exige Origin e o cookie original de prova do navegador. Até a confirmação, a resposta é 202 {status: \"pending\"}.",
            "Após a confirmação, 200 retorna status=authenticated, user, csrfToken e expiresAt. Uma sessão é emitida uma única vez. Desafios expirados retornam 410; desafios usados ou cancelados retornam 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": "Lendo a sessão",
          "paragraphs": [
            "GET /api/auth/me retorna 200 {authenticated:false} quando não existe sessão válida. Uma resposta com login inclui o usuário, token CSRF e expiração.",
            "O cookie __Host-kevmi-session dura até 24 horas com Secure, HttpOnly, SameSite=Lax e Path=/. O banco de dados armazena um hash SHA-256 do token. Um formulário de perfil não pode ler nem substituir o cookie."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "write",
          "title": "Alterações de conta",
          "paragraphs": [
            "Mutações exigem a sessão, Origin exata e o X-CSRF-Token atual. Sec-Fetch-Site: cross-site é rejeitado. O servidor não oferece acesso CORS arbitrário.",
            "O ID da conta vem da sessão, não da entrada da solicitação. Registros ausentes ou de outro usuário não revelam detalhes de propriedade identificáveis."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "logout",
          "title": "Encerrando a sessão",
          "paragraphs": [
            "POST /api/auth/logout encerra a sessão atual e limpa o cookie. Origin e CSRF são obrigatórios; o corpo não é lido. Telegram /logout também encerra todas as sessões da conta.",
            "Cookies não se movem automaticamente para outro domínio. Ao mudar o domínio do serviço, atualize APP_ORIGIN e o webhook do bot, depois faça login novamente."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "assistant-admin-v16",
          "title": "Assistente, suporte e administração de projetos",
          "paragraphs": [
            "Um primeiro login pelo Telegram cria uma conta e uma loja rascunho com status not_submitted, não um comerciante aprovado. A conta abre o formulário de inscrição para revisão atual; aceitar pagamentos requer aprovação de especialista. Cada nova loja tem sua própria revisão. GET /api/stores retorna reviewStatus e applicationId. Lojas conectadas mantêm acesso agregado, e suporte e documentação permanecem disponíveis durante a revisão.",
            "Ativar Permitir acesso aos meus dados no chat quando precisar de ajuda com operações privadas. Uma solicitação da web com includeAccount=true exige uma sessão válida, Origin e X-CSRF-Token; X-Kevmi-Store seleciona uma loja própria ou todas as lojas próprias. Sem permissão, o assistente usa documentação pública. No Telegram, um botão separado permite o acesso depois que o remetente for identificado.",
            "A ferramenta read_account lê lojas próprias, faturas com status de recebimento verificado, eventos, aplicativos e solicitações de suporte com respostas de especialistas. Ela retorna 30 registros e nextPage; registros mais antigos estão disponíveis por paginação. As leituras por resposta são limitadas, portanto uma amostra incompleta deve ser divulgada. Chaves de API, segredos de webhook, detalhes de cartão e sessões não são fornecidos à ferramenta. Ela não pode cobrar, pagar, reembolsar ou alterar configurações.",
            "Criar uma solicitação de suporte no espaço de trabalho ou no Telegram coloca um alerta separado de administrador em uma fila durável. Ela vincula a /admin/tickets?ticket=<id>; falhas temporárias do Telegram são repetidas. A recuperação também pega solicitações abertas mais antigas sem alerta. Os administradores respondem na página da solicitação; a resposta é salva no espaço de trabalho do usuário e enviada pelo Telegram quando as notificações de suporte estão ativadas.",
            "O bot usa botões em linha para o menu principal, lojas, notificações, suporte, segurança e idioma. A navegação edita a mensagem atual; um menu antigo indisponível é substituído. Notificações de pagamento e segurança não são tratadas como navegação descartável. Sair pelo menu exige confirmação. O comando explícito /logout ainda encerra todas as sessões da conta.",
            "O painel /admin/project é restrito a IDs do Telegram na lista de permissão MODERATOR_TELEGRAM_IDS no lado do servidor. Inclui usuários, lojas, operações, revogação de chaves, desativação de webhooks, pausa de faturas, controles de aceitação e um registro de auditoria. Mutações exigem CSRF e um motivo. O painel não pode restringir um administrador nem declarar manualmente um pagamento como bem-sucedido. Restringir um proprietário encerra sessões e bloqueia o acesso a chaves de API; restringir uma loja interrompe novas operações. O histórico é mantido.",
            "A oferta pública está disponível em /public-offer e a política de privacidade em /privacy-policy em todos os idiomas habilitados. Pesquise moedas por nome ou ticker. Um seletor de rede aparece somente quando várias redes ativas estão disponíveis. Uma única rede é selecionada automaticamente e permanece nomeada na confirmação. A disponibilidade ao vivo do gateway determina os pares selecionáveis; o catálogo de referência não habilita um serviço.",
            "Use update.sh para lançamentos de rotina do app da web: compile o candidato, verifique o histórico de migrações, faça backup do SQLite online, inicie um segundo contêiner, verifique-o e alterne o Caddy sem interrupção. Gateway, PostgreSQL e e-mail não são reiniciados. Ativos estáticos anteriores permanecem disponíveis para abas abertas. Uma nova migração exige autorização revisada explícita; uma mudança incompatível de esquema não é uma implantação sem interrupção."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Oferta pública",
              "href": "/public-offer"
            },
            {
              "label": "Política de privacidade",
              "href": "/privacy-policy"
            }
          ]
        }
      ],
      "body": "Iniciando login\n\nPOST /api/auth/telegram/start aceita um objeto JSON vazio {}. Exige a Origin exata do aplicativo e um bot disponível. O servidor cria um desafio com duração de 300 segundos e um cookie protegido de prova do navegador.\n\nA resposta 201 contém challengeId, code, expiresAt e telegramUrl. O cookie de prova é excluído do link profundo e é inacessível ao JavaScript. O limite é de seis inícios por minuto por endereço com hash.\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\nAguardando confirmação\n\nPOST /api/auth/telegram/complete aceita {challengeId}. Exige Origin e o cookie original de prova do navegador. Até a confirmação, a resposta é 202 {status: \"pending\"}.\n\nApós a confirmação, 200 retorna status=authenticated, user, csrfToken e expiresAt. Uma sessão é emitida uma única vez. Desafios expirados retornam 410; desafios usados ou cancelados retornam 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\nLendo a sessão\n\nGET /api/auth/me retorna 200 {authenticated:false} quando não existe sessão válida. Uma resposta com login inclui o usuário, token CSRF e expiração.\n\nO cookie __Host-kevmi-session dura até 24 horas com Secure, HttpOnly, SameSite=Lax e Path=/. O banco de dados armazena um hash SHA-256 do token. Um formulário de perfil não pode ler nem substituir o cookie.\n\nAlterações de conta\n\nMutações exigem a sessão, Origin exata e o X-CSRF-Token atual. Sec-Fetch-Site: cross-site é rejeitado. O servidor não oferece acesso CORS arbitrário.\n\nO ID da conta vem da sessão, não da entrada da solicitação. Registros ausentes ou de outro usuário não revelam detalhes de propriedade identificáveis.\n\nEncerrando a sessão\n\nPOST /api/auth/logout encerra a sessão atual e limpa o cookie. Origin e CSRF são obrigatórios; o corpo não é lido. Telegram /logout também encerra todas as sessões da conta.\n\nCookies não se movem automaticamente para outro domínio. Ao mudar o domínio do serviço, atualize APP_ORIGIN e o webhook do bot, depois faça login novamente.\n\nAssistente, suporte e administração de projetos\n\nUm primeiro login pelo Telegram cria uma conta e uma loja rascunho com status not_submitted, não um comerciante aprovado. A conta abre o formulário de inscrição para revisão atual; aceitar pagamentos requer aprovação de especialista. Cada nova loja tem sua própria revisão. GET /api/stores retorna reviewStatus e applicationId. Lojas conectadas mantêm acesso agregado, e suporte e documentação permanecem disponíveis durante a revisão.\n\nAtivar Permitir acesso aos meus dados no chat quando precisar de ajuda com operações privadas. Uma solicitação da web com includeAccount=true exige uma sessão válida, Origin e X-CSRF-Token; X-Kevmi-Store seleciona uma loja própria ou todas as lojas próprias. Sem permissão, o assistente usa documentação pública. No Telegram, um botão separado permite o acesso depois que o remetente for identificado.\n\nA ferramenta read_account lê lojas próprias, faturas com status de recebimento verificado, eventos, aplicativos e solicitações de suporte com respostas de especialistas. Ela retorna 30 registros e nextPage; registros mais antigos estão disponíveis por paginação. As leituras por resposta são limitadas, portanto uma amostra incompleta deve ser divulgada. Chaves de API, segredos de webhook, detalhes de cartão e sessões não são fornecidos à ferramenta. Ela não pode cobrar, pagar, reembolsar ou alterar configurações.\n\nCriar uma solicitação de suporte no espaço de trabalho ou no Telegram coloca um alerta separado de administrador em uma fila durável. Ela vincula a /admin/tickets?ticket=<id>; falhas temporárias do Telegram são repetidas. A recuperação também pega solicitações abertas mais antigas sem alerta. Os administradores respondem na página da solicitação; a resposta é salva no espaço de trabalho do usuário e enviada pelo Telegram quando as notificações de suporte estão ativadas.\n\nO bot usa botões em linha para o menu principal, lojas, notificações, suporte, segurança e idioma. A navegação edita a mensagem atual; um menu antigo indisponível é substituído. Notificações de pagamento e segurança não são tratadas como navegação descartável. Sair pelo menu exige confirmação. O comando explícito /logout ainda encerra todas as sessões da conta.\n\nO painel /admin/project é restrito a IDs do Telegram na lista de permissão MODERATOR_TELEGRAM_IDS no lado do servidor. Inclui usuários, lojas, operações, revogação de chaves, desativação de webhooks, pausa de faturas, controles de aceitação e um registro de auditoria. Mutações exigem CSRF e um motivo. O painel não pode restringir um administrador nem declarar manualmente um pagamento como bem-sucedido. Restringir um proprietário encerra sessões e bloqueia o acesso a chaves de API; restringir uma loja interrompe novas operações. O histórico é mantido.\n\nA oferta pública está disponível em /public-offer e a política de privacidade em /privacy-policy em todos os idiomas habilitados. Pesquise moedas por nome ou ticker. Um seletor de rede aparece somente quando várias redes ativas estão disponíveis. Uma única rede é selecionada automaticamente e permanece nomeada na confirmação. A disponibilidade ao vivo do gateway determina os pares selecionáveis; o catálogo de referência não habilita um serviço.\n\nUse update.sh para lançamentos de rotina do app da web: compile o candidato, verifique o histórico de migrações, faça backup do SQLite online, inicie um segundo contêiner, verifique-o e alterne o Caddy sem interrupção. Gateway, PostgreSQL e e-mail não são reiniciados. Ativos estáticos anteriores permanecem disponíveis para abas abertas. Uma nova migração exige autorização revisada explícita; uma mudança incompatível de esquema não é uma implantação sem interrupção.\n\nOferta pública\n\nPolítica de privacidade",
      "readMinutes": 3
    },
    {
      "id": "errors",
      "title": "Erros e novas tentativas",
      "summary": "Erros da API usam um formato consistente. O código é para lógica do aplicativo; a mensagem explica o problema. Mantenha a entrada do usuário intacta e ofereça um próximo passo claro.",
      "group": "developers",
      "url": "/docs/errors",
      "tags": [
        "erro",
        "429",
        "503",
        "nova tentativa",
        "status"
      ],
      "sections": [
        {
          "id": "format",
          "title": "Um formato de erro",
          "paragraphs": [
            "Respostas não incluem rastreamentos de pilha, SQL, tokens nem uma resposta completa do provedor externo. Não exiba logs internos brutos a um cliente."
          ],
          "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": "Grupos de erro comuns",
          "paragraphs": [],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "HTTP",
              "Exemplos",
              "Próximo passo"
            ],
            "rows": [
              [
                "400",
                "INVALID_JSON, UNKNOWN_FIELD, INVALID_INPUT",
                "Verifique a entrada e os campos permitidos"
              ],
              [
                "401",
                "AUTH_REQUIRED, SESSION_EXPIRED",
                "Faça login novamente"
              ],
              [
                "403",
                "INVALID_ORIGIN, CSRF_REQUIRED",
                "Verifique a origin e a sessão atual"
              ],
              [
                "404",
                "NOT_FOUND, TICKET_NOT_FOUND",
                "Verifique o endereço e a propriedade"
              ],
              [
                "409",
                "CHALLENGE_UNAVAILABLE",
                "Inicie um novo login"
              ],
              [
                "410",
                "CHALLENGE_EXPIRED",
                "Crie um novo link de login"
              ],
              [
                "413",
                "REQUEST_TOO_LARGE",
                "Reduza o corpo da solicitação"
              ],
              [
                "415",
                "JSON_REQUIRED",
                "Envie application/json"
              ],
              [
                "429",
                "RATE_LIMITED",
                "Reduza a frequência e aguarde"
              ],
              [
                "503",
                "GATEWAY_NOT_CONNECTED, SERVICE_UNAVAILABLE",
                "Verifique a disponibilidade ou tente mais tarde"
              ]
            ]
          },
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "rate",
          "title": "Limites de taxa",
          "paragraphs": [],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Ação",
              "Limite"
            ],
            "rows": [
              [
                "Iniciar login",
                "6 por minuto por endereço com hash"
              ],
              [
                "Verificar um desafio",
                "90 por minuto por desafio"
              ],
              [
                "Pergunta de conhecimento",
                "12 por minuto por endereço com hash com D1"
              ],
              [
                "Criar um link de servidor",
                "20 por minuto por usuário"
              ],
              [
                "API de comerciante",
                "90 solicitações por minuto por chave"
              ],
              [
                "Novo aplicativo",
                "Cinco por dia por usuário"
              ],
              [
                "Retomar aplicativo / decisão do moderador",
                "30 por minuto por usuário para cada ação"
              ],
              [
                "Revisão de site com IA",
                "30 por hora em todo o serviço"
              ],
              [
                "Leia o checkout ou tente efetuar um pagamento",
                "90 por minuto por endereço com hash"
              ],
              [
                "Crie uma solicitação de suporte",
                "6 por hora por usuário"
              ],
              [
                "Teste uma notificação",
                "3 por hora por usuário"
              ],
              [
                "Geração com IA",
                "60 por hora em todo o serviço por padrão"
              ]
            ]
          },
          "code": null,
          "note": "Retry-After: 60 indica um atraso, não uma garantia de que uma cota horária foi redefinida.",
          "links": []
        },
        {
          "id": "retry",
          "title": "O que pode ser repetido",
          "paragraphs": [
            "Uma leitura pode ser repetida após um atraso em uma falha temporária de rede. Antes de repetir uma mutação, verifique se a operação original foi concluída; uma resposta perdida não prova uma falha.",
            "Operações financeiras exigem idempotência e uma verificação do status do servidor. Um redirecionamento do cliente para uma página de resultado não substitui uma confirmação."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "report",
          "title": "O que incluir em uma solicitação",
          "paragraphs": [],
          "bullets": [
            "A página e a ação imediatamente anteriores ao erro.",
            "Hora, fuso horário e o código de erro visível.",
            "Sua fatura ou referência de solicitação de suporte, se disponível.",
            "Uma breve descrição do resultado que você esperava."
          ],
          "steps": [],
          "table": null,
          "code": null,
          "note": "Não anexe cookies, tokens, cabeçalhos de autorização, CVV ou códigos bancários.",
          "links": []
        }
      ],
      "body": "Um formato de erro\n\nRespostas não incluem rastreamentos de pilha, SQL, tokens nem uma resposta completa do provedor externo. Não exiba logs internos brutos a um cliente.\n\n{\n  \"error\": {\n    \"code\": \"GATEWAY_NOT_CONNECTED\",\n    \"message\": \"Financial operations are temporarily unavailable. Try later or contact support.\"\n  }\n}\n\nGrupos de erro comuns\n\nHTTP · Exemplos · Próximo passo\n400 · INVALID_JSON, UNKNOWN_FIELD, INVALID_INPUT · Verifique a entrada e os campos permitidos\n401 · AUTH_REQUIRED, SESSION_EXPIRED · Faça login novamente\n403 · INVALID_ORIGIN, CSRF_REQUIRED · Verifique a origin e a sessão atual\n404 · NOT_FOUND, TICKET_NOT_FOUND · Verifique o endereço e a propriedade\n409 · CHALLENGE_UNAVAILABLE · Inicie um novo login\n410 · CHALLENGE_EXPIRED · Crie um novo link de login\n413 · REQUEST_TOO_LARGE · Reduza o corpo da solicitação\n415 · JSON_REQUIRED · Envie application/json\n429 · RATE_LIMITED · Reduza a frequência e aguarde\n503 · GATEWAY_NOT_CONNECTED, SERVICE_UNAVAILABLE · Verifique a disponibilidade ou tente mais tarde\n\nLimites de taxa\n\nAção · Limite\nIniciar login · 6 por minuto por endereço com hash\nVerificar um desafio · 90 por minuto por desafio\nPergunta de conhecimento · 12 por minuto por endereço com hash com D1\nCriar um link de servidor · 20 por minuto por usuário\nAPI de comerciante · 90 solicitações por minuto por chave\nNovo aplicativo · Cinco por dia por usuário\nRetomar aplicativo / decisão do moderador · 30 por minuto por usuário para cada ação\nRevisão de site com IA · 30 por hora em todo o serviço\nLeia o checkout ou tente efetuar um pagamento · 90 por minuto por endereço com hash\nCrie uma solicitação de suporte · 6 por hora por usuário\nTeste uma notificação · 3 por hora por usuário\nGeração com IA · 60 por hora em todo o serviço por padrão\n\nRetry-After: 60 indica um atraso, não uma garantia de que uma cota horária foi redefinida.\n\nO que pode ser repetido\n\nUma leitura pode ser repetida após um atraso em uma falha temporária de rede. Antes de repetir uma mutação, verifique se a operação original foi concluída; uma resposta perdida não prova uma falha.\n\nOperações financeiras exigem idempotência e uma verificação do status do servidor. Um redirecionamento do cliente para uma página de resultado não substitui uma confirmação.\n\nO que incluir em uma solicitação\n\nA página e a ação imediatamente anteriores ao erro.\n\nHora, fuso horário e o código de erro visível.\n\nSua fatura ou referência de solicitação de suporte, se disponível.\n\nUma breve descrição do resultado que você esperava.\n\nNão anexe cookies, tokens, cabeçalhos de autorização, CVV ou códigos bancários.",
      "readMinutes": 3
    },
    {
      "id": "security",
      "title": "Segurança da integração",
      "summary": "Verificações confiáveis são executadas no servidor. O navegador controla a interface, mas não pode estabelecer identidade, status financeiro ou valores finais.",
      "group": "developers",
      "url": "/docs/security",
      "tags": [
        "segurança",
        "CSRF",
        "cookie",
        "propriedade",
        "segredo",
        "idempotência"
      ],
      "sections": [
        {
          "id": "identity",
          "title": "Sessões e propriedade",
          "paragraphs": [
            "Uma sessão válida de servidor identifica a conta. Configurações, solicitações, notificações e links são filtrados pelo proprietário. Um userId enviado a partir de um formulário não pode substituir esse filtro.",
            "Mutações também verificam Origin e CSRF. Uma URL pública de fatura expõe apenas essa fatura e não concede acesso à conta."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "secrets",
          "title": "Segredos permanecem no servidor",
          "paragraphs": [
            "Segredos não devem aparecer em Git, HTML, JavaScript do cliente, exemplos de OpenAPI, arquivos llms ou mensagens de suporte. O nome de usuário público do bot não é um segredo."
          ],
          "bullets": [
            "Token do bot do Telegram e segredo do webhook.",
            "Credenciais de provedor externo de IA.",
            "Credenciais de gateway de pagamento e segredos de assinatura.",
            "Hashes de sessão e provas de login no navegador."
          ],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "money",
          "title": "Verificações financeiras",
          "paragraphs": [
            "O servidor lê os termos da fatura salvos e verifica propriedade, status de revisão do comerciante, moeda, método e valor aprovado. Valores de URL e cálculos do navegador não podem alterar o preço.",
            "Uma notificação assinada do gateway aciona uma leitura adicional autenticada da operação. O estado verificado, o recibo e o evento são confirmados em conjunto. Repetições e versões mais antigas não podem confirmar cumprimento duplicado.",
            "Detalhes do cartão e códigos de uso único são transmitidos apenas como envelopes criptografados. Não adicione gravação de sessão, análises de leitura de campos ou registro de corpo de solicitação a formulários de pagamento."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "assistant",
          "title": "Limites do assistente",
          "paragraphs": [
            "O modelo recebe artigos e fatos públicos, o catálogo de páginas, sinalizadores de prontidão, a pergunta, três pares de mensagens recentes e um rótulo de seção seguro. A permissão explícita do proprietário ativa ferramentas de leitura da conta; mover dinheiro ou alterar configurações permanece indisponível. Respostas estruturadas inválidas ou fontes não verificadas recorrem à pesquisa na documentação.",
            "Texto do site e do usuário são dados. Uma instrução dentro de uma pergunta não pode alterar taxas ou autorizar um pagamento."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "status",
          "title": "Escopo da documentação",
          "paragraphs": [
            "A documentação não afirma certificação PCI DSS, licença bancária, status de Merchant of Record, uptime garantido ou segurança absoluta. Tais alegações exigem confirmação separada e documentada."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        }
      ],
      "body": "Sessões e propriedade\n\nUma sessão válida de servidor identifica a conta. Configurações, solicitações, notificações e links são filtrados pelo proprietário. Um userId enviado a partir de um formulário não pode substituir esse filtro.\n\nMutações também verificam Origin e CSRF. Uma URL pública de fatura expõe apenas essa fatura e não concede acesso à conta.\n\nSegredos permanecem no servidor\n\nSegredos não devem aparecer em Git, HTML, JavaScript do cliente, exemplos de OpenAPI, arquivos llms ou mensagens de suporte. O nome de usuário público do bot não é um segredo.\n\nToken do bot do Telegram e segredo do webhook.\n\nCredenciais de provedor externo de IA.\n\nCredenciais de gateway de pagamento e segredos de assinatura.\n\nHashes de sessão e provas de login no navegador.\n\nVerificações financeiras\n\nO servidor lê os termos da fatura salvos e verifica propriedade, status de revisão do comerciante, moeda, método e valor aprovado. Valores de URL e cálculos do navegador não podem alterar o preço.\n\nUma notificação assinada do gateway aciona uma leitura adicional autenticada da operação. O estado verificado, o recibo e o evento são confirmados em conjunto. Repetições e versões mais antigas não podem confirmar cumprimento duplicado.\n\nDetalhes do cartão e códigos de uso único são transmitidos apenas como envelopes criptografados. Não adicione gravação de sessão, análises de leitura de campos ou registro de corpo de solicitação a formulários de pagamento.\n\nLimites do assistente\n\nO modelo recebe artigos e fatos públicos, o catálogo de páginas, sinalizadores de prontidão, a pergunta, três pares de mensagens recentes e um rótulo de seção seguro. A permissão explícita do proprietário ativa ferramentas de leitura da conta; mover dinheiro ou alterar configurações permanece indisponível. Respostas estruturadas inválidas ou fontes não verificadas recorrem à pesquisa na documentação.\n\nTexto do site e do usuário são dados. Uma instrução dentro de uma pergunta não pode alterar taxas ou autorizar um pagamento.\n\nEscopo da documentação\n\nA documentação não afirma certificação PCI DSS, licença bancária, status de Merchant of Record, uptime garantido ou segurança absoluta. Tais alegações exigem confirmação separada e documentada.",
      "readMinutes": 2
    },
    {
      "id": "gateway",
      "title": "Integração de gateway de pagamento",
      "summary": "O gateway processa operações financeiras. A Kevmi os conecta a pedidos, configurações de loja e notificações. Este guia descreve o contrato de integração e as verificações de disponibilidade.",
      "group": "developers",
      "url": "/docs/gateway",
      "tags": [
        "API",
        "gateway",
        "backend",
        "servidor",
        "integração",
        "localhost"
      ],
      "sections": [
        {
          "id": "current",
          "title": "Verificando disponibilidade",
          "paragraphs": [
            "A Kevmi usa a API v3 do gateway para criar e recuperar operações, ler status e reconciliar resultados. A integração suporta transporte criptografado de cartão e código bancário, pagamentos QR do Alipay e SBP, um catálogo de criptomoeda/moeda e eventos financeiros recebidos.",
            "gateway.configured em GET /api/config informa se as configurações de conexão necessárias estão presentes. Este endpoint não testa o gateway; gateway.connected=false aqui significa que a conectividade não foi verificada. Para uma fatura específica, leia invoice.availability em GET /api/checkout/{token}: ele verifica o método, valor, termos e aprovação do comerciante. O campo de compatibilidade invoice.gatewayConnected espelha availability.available e também não é uma verificação de saúde nem uma garantia de aprovação de pagamento.",
            "Um novo pagamento e uma intenção de cartão exigem que a solicitação mais recente de revisão do site do comerciante seja aprovada. A aprovação por si só não conecta o gateway de pagamento. Se a revisão mudar após o envio, a operação existente permanece disponível para leitura de status, conciliação e um código bancário solicitado."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "required",
          "title": "Contrato de checkout do cliente",
          "paragraphs": [
            "Dados sensíveis são criptografados no navegador com RSA-OAEP-256 e A256GCM. A chave privada permanece no gateway. A Kevmi valida que a intenção pertence a esta fatura e propósito, retransmite o envelope e não armazena números de cartão em texto simples, CVV, nome do comprador, e-mail, códigos bancários ou o próprio envelope.",
            "Instale a extensão de transporte criptografado no host do gateway antes de habilitar cartões. Ela verifica a assinatura da intenção, expiração, repetição, pedido e valores. Não há fallback em texto simples. Isso descreve o mecanismo de proteção, não a certificação PCI."
          ],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Rota da Kevmi",
              "Finalidade"
            ],
            "rows": [
              [
                "GET /api/checkout/{token}",
                "Fatura, cotação, disponibilidade de método e pagamento existente"
              ],
              [
                "POST /api/checkout/{token}/card-intent",
                "Intenção única e chave pública para pagamento ou código"
              ],
              [
                "POST /api/checkout/{token}/pay",
                "Iniciar uma operação; cartão criptografado: {intent,jwe}"
              ],
              [
                "POST /api/checkout/{token}/code",
                "Código único criptografado para o desafio bancário atual"
              ],
              [
                "GET /api/checkout/{token}/status",
                "Ler a operação original sem cobrança adicional"
              ],
              [
                "POST /api/checkout/{token}/reconcile",
                "Conciliar explicitamente a operação original"
              ],
              [
                "GET /api/checkout/{token}/crypto-services",
                "Moedas, redes e limites atuais para uma fatura USDT"
              ]
            ]
          },
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "network",
          "title": "Hospedagem e conectividade do gateway",
          "paragraphs": [
            "A Kevmi oferece hospedagem de Sites no Cloudflare Workers com D1 e auto-hospedagem em Node.js com SQLite. SQLite requer volume persistente e backups. O gateway de pagamento roda como serviço separado com armazenamento durável próprio.",
            "Um gateway externo exige uma origem HTTPS acessível pelo servidor. No pacote auto-hospedado, o servidor se conecta a um serviço de gateway fixo na rede privada do contêiner; a API do serviço de gateway não é exposta à internet. O site público e os callbacks usam HTTPS. O navegador também criptografa dados do cartão e códigos bancários antes de chegarem à Kevmi.",
            "localhost refere-se ao servidor ou contêiner atual; não expõe o computador do proprietário do gateway. Chaves de conexão e segredos pertencem apenas à configuração do servidor.",
            "Para um domínio personalizado, defina uma origem HTTPS pública em NEXT_PUBLIC_SITE_URL antes da compilação. Documentação, links canônicos e recursos de indexação usam esse valor. Ele aceita apenas um esquema e host com porta opcional, sem caminho, consulta, fragmento ou credenciais. Alinhe-o com APP_ORIGIN na configuração do servidor."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "adapter",
          "title": "Cálculo e termos suportados",
          "paragraphs": [
            "As faturas do novo workspace usam um preço base em USD e o plano Any oferece todos os quatro métodos. O SBP converte para RUB à taxa de referência congelada do Banco da Rússia; cripto usa a regra explícita de fatura 1:1 USD/USDT. O preço nativo legado permanece disponível para faturas antigas e solicitações de API sem pricingMode=universal. Consulte a seção de múltiplas lojas e preço em USD abaixo.",
            "Para um novo pagamento ao vivo com cartão ou Alipay, o gateway atual suporta apenas feeCustomerPercent=0 e vatCustomerPercent=100: o comerciante cobre toda a taxa de processamento e o IVA é adicionado integralmente para o cliente. Outras parcelas podem ser salvas e calculadas em uma fatura, mas a execução é bloqueada com unsupported_allocation. O servidor nunca altera silenciosamente os termos salvos. Pagamentos SBP e USDT cripto suportam todas as parcelas de taxa de processamento e não têm IVA.",
            "Enviar um total_cents arbitrário não altera o cálculo de impostos do provedor. Um valor real diferente do total salvo entra em revisão e não pode confirmar o cumprimento. Campos business_balance do gateway são retidos como evidência de liquidação, não tratados como saldo de comerciante da Kevmi."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "activation",
          "title": "Conectando um gateway ao vivo",
          "paragraphs": [
            "Conectar o gateway inclui configuração do servidor, verificações dos canais selecionados e processamento de eventos financeiros verificados. A prontidão da configuração é verificada separadamente da conectividade do provedor. Um pagamento bem-sucedido é aceito após verificar o status e o valor da operação. As instruções de implantação estão em ops/gateway-integration.md."
          ],
          "bullets": [],
          "steps": [
            "Implante o servidor Kevmi e o gateway como serviços separados. Configure armazenamento durável, backups e os processos em segundo plano necessários.",
            "Para uma conexão externa, defina uma origem HTTPS em GATEWAY_BASE_URL. O pacote auto-hospedado usa seu serviço interno configurado. Ambos exigem um GATEWAY_API_KEY somente do servidor e um GATEWAY_WEBHOOK_SECRET separado; segredos nunca chegam ao navegador.",
            "Defina BACKEND_WEBHOOK_URL do gateway como /api/gateway/webhook na Kevmi e um BACKEND_WEBHOOK_SECRET correspondente.",
            "Ative o transporte criptografado de cartão e mantenha sua chave privada exclusivamente no host do gateway. Verifique a disponibilidade da chave pública e as configurações correspondentes de assinatura de intenção.",
            "Verifique a prontidão do canal, restrições e a aprovação do site do comerciante antes do lançamento."
          ],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Webhooks e eventos repetidos",
              "href": "/docs/webhooks"
            },
            {
              "label": "Segurança",
              "href": "/docs/security"
            }
          ]
        },
        {
          "id": "stores-usd",
          "title": "Múltiplas lojas e um preço base em USD",
          "paragraphs": [
            "Escolha Todas as lojas para análises e operações agregadas, ou selecione uma loja para seus próprios registros. Cada loja tem um storeId separado, nome, padrão de IVA, faturas, chaves de API, endpoints de webhook, histórico de eventos e aplicativo de site. Notificações e tickets de suporte pertencem à conta. Uma conta pode criar até 100 lojas. Registros existentes permanecem na primeira loja.",
            "As faturas do novo workspace usam pricingMode=\"universal\" e um preço base em USD. O plano Any inclui cartão, alipay, sbp e cripto; um comerciante pode selecionar um subconjunto. Cartões e Alipay cobram em USD. O SBP cobra em RUB usando a taxa de referência USD/RUB do Banco da Rússia. Cripto cobra USDT sob a regra explícita de fatura 1 USD = 1 USDT. Esta é uma regra de conversão de fatura, não uma cotação de mercado de USDT. O gateway fornece a taxa da moeda selecionada, o valor exato da transferência e instruções antes da transferência.",
            "A taxa de referência e ambos os valores são congelados na criação. Faturas que envolvem conversão RUB expiram dentro de 24 horas. Se a taxa de referência não puder ser obtida, a criação falha com FX_UNAVAILABLE; nenhuma taxa de fallback inventada ou desatualizada é usada. O valor do proprietário em minor e cotações usam a moeda contábil USD. quotes[method].settlement contém a cotação de cobrança nativa. O checkout público expõe a moeda de cobrança selecionada em currency, o preço original em baseAmountMinor/baseCurrency, e a taxa de referência em fx. Uma vez que um pagamento foi enviado, seu método não pode ser alterado; uma fatura tem uma operação de gateway.",
            "Crie uma chave de API dentro da loja pretendida e envie Authorization: Bearer <key> do seu servidor. Seu vínculo de loja é imutável; X-Kevmi-Store não pode conceder acesso a outra loja. Sessões de navegador selecionam X-Kevmi-Store: <storeId>; omitir seleciona a primeira loja. O valor all é aceito apenas por GET /api/account/dashboard e GET /api/payment-links. Mutações exigem uma loja selecionada, Origin e X-CSRF-Token. IDs de conta e IDs de loja são identificadores diferentes.",
            "Para compatibilidade, solicitações de API sem pricingMode=\"universal\" mantêm preço nativo e as restrições originais de moeda. Faturas existentes nunca são recalculadas. Recibos confirmados nas análises refletem pagamentos verificados menos despesas de fatura salvas; eles não são um saldo sacável. Moedas de fatura legadas permanecem separadas e pagamentos são combinados com o suporte. Cumpra um pedido somente após verificar payment.fulfillmentReady=true e payment.status=\"succeeded\" através da API do servidor, histórico de eventos ou um webhook assinado."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "assistant-admin-v16",
          "title": "Assistente, suporte e administração de projetos",
          "paragraphs": [
            "Um primeiro login pelo Telegram cria uma conta e uma loja rascunho com status not_submitted, não um comerciante aprovado. A conta abre o formulário de inscrição para revisão atual; aceitar pagamentos requer aprovação de especialista. Cada nova loja tem sua própria revisão. GET /api/stores retorna reviewStatus e applicationId. Lojas conectadas mantêm acesso agregado, e suporte e documentação permanecem disponíveis durante a revisão.",
            "Ativar Permitir acesso aos meus dados no chat quando precisar de ajuda com operações privadas. Uma solicitação da web com includeAccount=true exige uma sessão válida, Origin e X-CSRF-Token; X-Kevmi-Store seleciona uma loja própria ou todas as lojas próprias. Sem permissão, o assistente usa documentação pública. No Telegram, um botão separado permite o acesso depois que o remetente for identificado.",
            "A ferramenta read_account lê lojas próprias, faturas com status de recebimento verificado, eventos, aplicativos e solicitações de suporte com respostas de especialistas. Ela retorna 30 registros e nextPage; registros mais antigos estão disponíveis por paginação. As leituras por resposta são limitadas, portanto uma amostra incompleta deve ser divulgada. Chaves de API, segredos de webhook, detalhes de cartão e sessões não são fornecidos à ferramenta. Ela não pode cobrar, pagar, reembolsar ou alterar configurações.",
            "Criar uma solicitação de suporte no espaço de trabalho ou no Telegram coloca um alerta separado de administrador em uma fila durável. Ela vincula a /admin/tickets?ticket=<id>; falhas temporárias do Telegram são repetidas. A recuperação também pega solicitações abertas mais antigas sem alerta. Os administradores respondem na página da solicitação; a resposta é salva no espaço de trabalho do usuário e enviada pelo Telegram quando as notificações de suporte estão ativadas.",
            "O bot usa botões em linha para o menu principal, lojas, notificações, suporte, segurança e idioma. A navegação edita a mensagem atual; um menu antigo indisponível é substituído. Notificações de pagamento e segurança não são tratadas como navegação descartável. Sair pelo menu exige confirmação. O comando explícito /logout ainda encerra todas as sessões da conta.",
            "O painel /admin/project é restrito a IDs do Telegram na lista de permissão MODERATOR_TELEGRAM_IDS no lado do servidor. Inclui usuários, lojas, operações, revogação de chaves, desativação de webhooks, pausa de faturas, controles de aceitação e um registro de auditoria. Mutações exigem CSRF e um motivo. O painel não pode restringir um administrador nem declarar manualmente um pagamento como bem-sucedido. Restringir um proprietário encerra sessões e bloqueia o acesso a chaves de API; restringir uma loja interrompe novas operações. O histórico é mantido.",
            "A oferta pública está disponível em /public-offer e a política de privacidade em /privacy-policy em todos os idiomas habilitados. Pesquise moedas por nome ou ticker. Um seletor de rede aparece somente quando várias redes ativas estão disponíveis. Uma única rede é selecionada automaticamente e permanece nomeada na confirmação. A disponibilidade ao vivo do gateway determina os pares selecionáveis; o catálogo de referência não habilita um serviço.",
            "Use update.sh para lançamentos de rotina do app da web: compile o candidato, verifique o histórico de migrações, faça backup do SQLite online, inicie um segundo contêiner, verifique-o e alterne o Caddy sem interrupção. Gateway, PostgreSQL e e-mail não são reiniciados. Ativos estáticos anteriores permanecem disponíveis para abas abertas. Uma nova migração exige autorização revisada explícita; uma mudança incompatível de esquema não é uma implantação sem interrupção."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Oferta pública",
              "href": "/public-offer"
            },
            {
              "label": "Política de privacidade",
              "href": "/privacy-policy"
            }
          ]
        }
      ],
      "body": "Verificando disponibilidade\n\nA Kevmi usa a API v3 do gateway para criar e recuperar operações, ler status e reconciliar resultados. A integração suporta transporte criptografado de cartão e código bancário, pagamentos QR do Alipay e SBP, um catálogo de criptomoeda/moeda e eventos financeiros recebidos.\n\ngateway.configured em GET /api/config informa se as configurações de conexão necessárias estão presentes. Este endpoint não testa o gateway; gateway.connected=false aqui significa que a conectividade não foi verificada. Para uma fatura específica, leia invoice.availability em GET /api/checkout/{token}: ele verifica o método, valor, termos e aprovação do comerciante. O campo de compatibilidade invoice.gatewayConnected espelha availability.available e também não é uma verificação de saúde nem uma garantia de aprovação de pagamento.\n\nUm novo pagamento e uma intenção de cartão exigem que a solicitação mais recente de revisão do site do comerciante seja aprovada. A aprovação por si só não conecta o gateway de pagamento. Se a revisão mudar após o envio, a operação existente permanece disponível para leitura de status, conciliação e um código bancário solicitado.\n\nContrato de checkout do cliente\n\nDados sensíveis são criptografados no navegador com RSA-OAEP-256 e A256GCM. A chave privada permanece no gateway. A Kevmi valida que a intenção pertence a esta fatura e propósito, retransmite o envelope e não armazena números de cartão em texto simples, CVV, nome do comprador, e-mail, códigos bancários ou o próprio envelope.\n\nInstale a extensão de transporte criptografado no host do gateway antes de habilitar cartões. Ela verifica a assinatura da intenção, expiração, repetição, pedido e valores. Não há fallback em texto simples. Isso descreve o mecanismo de proteção, não a certificação PCI.\n\nRota da Kevmi · Finalidade\nGET /api/checkout/{token} · Fatura, cotação, disponibilidade de método e pagamento existente\nPOST /api/checkout/{token}/card-intent · Intenção única e chave pública para pagamento ou código\nPOST /api/checkout/{token}/pay · Iniciar uma operação; cartão criptografado: {intent,jwe}\nPOST /api/checkout/{token}/code · Código único criptografado para o desafio bancário atual\nGET /api/checkout/{token}/status · Ler a operação original sem cobrança adicional\nPOST /api/checkout/{token}/reconcile · Conciliar explicitamente a operação original\nGET /api/checkout/{token}/crypto-services · Moedas, redes e limites atuais para uma fatura USDT\n\nHospedagem e conectividade do gateway\n\nA Kevmi oferece hospedagem de Sites no Cloudflare Workers com D1 e auto-hospedagem em Node.js com SQLite. SQLite requer volume persistente e backups. O gateway de pagamento roda como serviço separado com armazenamento durável próprio.\n\nUm gateway externo exige uma origem HTTPS acessível pelo servidor. No pacote auto-hospedado, o servidor se conecta a um serviço de gateway fixo na rede privada do contêiner; a API do serviço de gateway não é exposta à internet. O site público e os callbacks usam HTTPS. O navegador também criptografa dados do cartão e códigos bancários antes de chegarem à Kevmi.\n\nlocalhost refere-se ao servidor ou contêiner atual; não expõe o computador do proprietário do gateway. Chaves de conexão e segredos pertencem apenas à configuração do servidor.\n\nPara um domínio personalizado, defina uma origem HTTPS pública em NEXT_PUBLIC_SITE_URL antes da compilação. Documentação, links canônicos e recursos de indexação usam esse valor. Ele aceita apenas um esquema e host com porta opcional, sem caminho, consulta, fragmento ou credenciais. Alinhe-o com APP_ORIGIN na configuração do servidor.\n\nCálculo e termos suportados\n\nAs faturas do novo workspace usam um preço base em USD e o plano Any oferece todos os quatro métodos. O SBP converte para RUB à taxa de referência congelada do Banco da Rússia; cripto usa a regra explícita de fatura 1:1 USD/USDT. O preço nativo legado permanece disponível para faturas antigas e solicitações de API sem pricingMode=universal. Consulte a seção de múltiplas lojas e preço em USD abaixo.\n\nPara um novo pagamento ao vivo com cartão ou Alipay, o gateway atual suporta apenas feeCustomerPercent=0 e vatCustomerPercent=100: o comerciante cobre toda a taxa de processamento e o IVA é adicionado integralmente para o cliente. Outras parcelas podem ser salvas e calculadas em uma fatura, mas a execução é bloqueada com unsupported_allocation. O servidor nunca altera silenciosamente os termos salvos. Pagamentos SBP e USDT cripto suportam todas as parcelas de taxa de processamento e não têm IVA.\n\nEnviar um total_cents arbitrário não altera o cálculo de impostos do provedor. Um valor real diferente do total salvo entra em revisão e não pode confirmar o cumprimento. Campos business_balance do gateway são retidos como evidência de liquidação, não tratados como saldo de comerciante da Kevmi.\n\nConectando um gateway ao vivo\n\nConectar o gateway inclui configuração do servidor, verificações dos canais selecionados e processamento de eventos financeiros verificados. A prontidão da configuração é verificada separadamente da conectividade do provedor. Um pagamento bem-sucedido é aceito após verificar o status e o valor da operação. As instruções de implantação estão em ops/gateway-integration.md.\n\nImplante o servidor Kevmi e o gateway como serviços separados. Configure armazenamento durável, backups e os processos em segundo plano necessários.\n\nPara uma conexão externa, defina uma origem HTTPS em GATEWAY_BASE_URL. O pacote auto-hospedado usa seu serviço interno configurado. Ambos exigem um GATEWAY_API_KEY somente do servidor e um GATEWAY_WEBHOOK_SECRET separado; segredos nunca chegam ao navegador.\n\nDefina BACKEND_WEBHOOK_URL do gateway como /api/gateway/webhook na Kevmi e um BACKEND_WEBHOOK_SECRET correspondente.\n\nAtive o transporte criptografado de cartão e mantenha sua chave privada exclusivamente no host do gateway. Verifique a disponibilidade da chave pública e as configurações correspondentes de assinatura de intenção.\n\nVerifique a prontidão do canal, restrições e a aprovação do site do comerciante antes do lançamento.\n\nWebhooks e eventos repetidos\n\nSegurança\n\nMúltiplas lojas e um preço base em USD\n\nEscolha Todas as lojas para análises e operações agregadas, ou selecione uma loja para seus próprios registros. Cada loja tem um storeId separado, nome, padrão de IVA, faturas, chaves de API, endpoints de webhook, histórico de eventos e aplicativo de site. Notificações e tickets de suporte pertencem à conta. Uma conta pode criar até 100 lojas. Registros existentes permanecem na primeira loja.\n\nAs faturas do novo workspace usam pricingMode=\"universal\" e um preço base em USD. O plano Any inclui cartão, alipay, sbp e cripto; um comerciante pode selecionar um subconjunto. Cartões e Alipay cobram em USD. O SBP cobra em RUB usando a taxa de referência USD/RUB do Banco da Rússia. Cripto cobra USDT sob a regra explícita de fatura 1 USD = 1 USDT. Esta é uma regra de conversão de fatura, não uma cotação de mercado de USDT. O gateway fornece a taxa da moeda selecionada, o valor exato da transferência e instruções antes da transferência.\n\nA taxa de referência e ambos os valores são congelados na criação. Faturas que envolvem conversão RUB expiram dentro de 24 horas. Se a taxa de referência não puder ser obtida, a criação falha com FX_UNAVAILABLE; nenhuma taxa de fallback inventada ou desatualizada é usada. O valor do proprietário em minor e cotações usam a moeda contábil USD. quotes[method].settlement contém a cotação de cobrança nativa. O checkout público expõe a moeda de cobrança selecionada em currency, o preço original em baseAmountMinor/baseCurrency, e a taxa de referência em fx. Uma vez que um pagamento foi enviado, seu método não pode ser alterado; uma fatura tem uma operação de gateway.\n\nCrie uma chave de API dentro da loja pretendida e envie Authorization: Bearer <key> do seu servidor. Seu vínculo de loja é imutável; X-Kevmi-Store não pode conceder acesso a outra loja. Sessões de navegador selecionam X-Kevmi-Store: <storeId>; omitir seleciona a primeira loja. O valor all é aceito apenas por GET /api/account/dashboard e GET /api/payment-links. Mutações exigem uma loja selecionada, Origin e X-CSRF-Token. IDs de conta e IDs de loja são identificadores diferentes.\n\nPara compatibilidade, solicitações de API sem pricingMode=\"universal\" mantêm preço nativo e as restrições originais de moeda. Faturas existentes nunca são recalculadas. Recibos confirmados nas análises refletem pagamentos verificados menos despesas de fatura salvas; eles não são um saldo sacável. Moedas de fatura legadas permanecem separadas e pagamentos são combinados com o suporte. Cumpra um pedido somente após verificar payment.fulfillmentReady=true e payment.status=\"succeeded\" através da API do servidor, histórico de eventos ou um webhook assinado.\n\nAssistente, suporte e administração de projetos\n\nUm primeiro login pelo Telegram cria uma conta e uma loja rascunho com status not_submitted, não um comerciante aprovado. A conta abre o formulário de inscrição para revisão atual; aceitar pagamentos requer aprovação de especialista. Cada nova loja tem sua própria revisão. GET /api/stores retorna reviewStatus e applicationId. Lojas conectadas mantêm acesso agregado, e suporte e documentação permanecem disponíveis durante a revisão.\n\nAtivar Permitir acesso aos meus dados no chat quando precisar de ajuda com operações privadas. Uma solicitação da web com includeAccount=true exige uma sessão válida, Origin e X-CSRF-Token; X-Kevmi-Store seleciona uma loja própria ou todas as lojas próprias. Sem permissão, o assistente usa documentação pública. No Telegram, um botão separado permite o acesso depois que o remetente for identificado.\n\nA ferramenta read_account lê lojas próprias, faturas com status de recebimento verificado, eventos, aplicativos e solicitações de suporte com respostas de especialistas. Ela retorna 30 registros e nextPage; registros mais antigos estão disponíveis por paginação. As leituras por resposta são limitadas, portanto uma amostra incompleta deve ser divulgada. Chaves de API, segredos de webhook, detalhes de cartão e sessões não são fornecidos à ferramenta. Ela não pode cobrar, pagar, reembolsar ou alterar configurações.\n\nCriar uma solicitação de suporte no espaço de trabalho ou no Telegram coloca um alerta separado de administrador em uma fila durável. Ela vincula a /admin/tickets?ticket=<id>; falhas temporárias do Telegram são repetidas. A recuperação também pega solicitações abertas mais antigas sem alerta. Os administradores respondem na página da solicitação; a resposta é salva no espaço de trabalho do usuário e enviada pelo Telegram quando as notificações de suporte estão ativadas.\n\nO bot usa botões em linha para o menu principal, lojas, notificações, suporte, segurança e idioma. A navegação edita a mensagem atual; um menu antigo indisponível é substituído. Notificações de pagamento e segurança não são tratadas como navegação descartável. Sair pelo menu exige confirmação. O comando explícito /logout ainda encerra todas as sessões da conta.\n\nO painel /admin/project é restrito a IDs do Telegram na lista de permissão MODERATOR_TELEGRAM_IDS no lado do servidor. Inclui usuários, lojas, operações, revogação de chaves, desativação de webhooks, pausa de faturas, controles de aceitação e um registro de auditoria. Mutações exigem CSRF e um motivo. O painel não pode restringir um administrador nem declarar manualmente um pagamento como bem-sucedido. Restringir um proprietário encerra sessões e bloqueia o acesso a chaves de API; restringir uma loja interrompe novas operações. O histórico é mantido.\n\nA oferta pública está disponível em /public-offer e a política de privacidade em /privacy-policy em todos os idiomas habilitados. Pesquise moedas por nome ou ticker. Um seletor de rede aparece somente quando várias redes ativas estão disponíveis. Uma única rede é selecionada automaticamente e permanece nomeada na confirmação. A disponibilidade ao vivo do gateway determina os pares selecionáveis; o catálogo de referência não habilita um serviço.\n\nUse update.sh para lançamentos de rotina do app da web: compile o candidato, verifique o histórico de migrações, faça backup do SQLite online, inicie um segundo contêiner, verifique-o e alterne o Caddy sem interrupção. Gateway, PostgreSQL e e-mail não são reiniciados. Ativos estáticos anteriores permanecem disponíveis para abas abertas. Uma nova migração exige autorização revisada explícita; uma mudança incompatível de esquema não é uma implantação sem interrupção.\n\nOferta pública\n\nPolítica de privacidade",
      "readMinutes": 6
    },
    {
      "id": "webhooks",
      "title": "Webhooks: eventos, assinaturas e entrega",
      "summary": "Registre um endpoint HTTPS público, prove controle e receba eventos assinados de fatura e pagamento. A entrega é enfileirada de forma durável; processar o mesmo evento novamente deve ser seguro para seu pedido.",
      "tags": [
        "webhook",
        "assinatura",
        "HMAC",
        "idempotência",
        "evento",
        "nova tentativa"
      ],
      "sections": [
        {
          "id": "sources",
          "title": "De onde vêm os eventos",
          "paragraphs": [
            "invoice.created não significa pago. Eventos de pagamento vêm de uma operação de servidor verificada após uma leitura atual do gateway; um nome de evento recebido sozinho é insuficiente.",
            "Entrada Gateway → Kevmi e entrega Kevmi → comerciante são pernas diferentes com segredos separados. O navegador, a navegação de retorno e mensagens de widget não definem estado financeiro."
          ],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Evento",
              "Fonte"
            ],
            "rows": [
              [
                "invoice.created",
                "Fatura persistida"
              ],
              [
                "invoice.updated",
                "Disponibilidade do link alterada"
              ],
              [
                "payment.succeeded",
                "Pagamento exato verificado pelo servidor"
              ],
              [
                "payment.failed",
                "Operação falha verificada"
              ],
              [
                "payment.refunded",
                "Reembolso total verificado"
              ],
              [
                "payment.partially_refunded",
                "Reembolso parcial verificado"
              ],
              [
                "payment.disputed",
                "Disputa verificada"
              ],
              [
                "payment.review_required",
                "Operação requer revisão adicional"
              ]
            ]
          },
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "setup",
          "title": "Registrar e verificar um endpoint",
          "paragraphs": [
            "URLs não podem apontar para endereços IP, localhost, redes privadas, portas não padrão ou conter credenciais. DNS é verificado antes da entrega; solicitações POST de saída não seguem redirecionamentos. Uma conta pode registrar até cinco endpoints.",
            "O evento de verificação tem livemode=false. Um status HTTP de sucesso sozinho é insuficiente: o desafio deve coincidir exatamente. Girar o segredo exige nova verificação."
          ],
          "bullets": [],
          "steps": [
            "Em /account#webhooks na sua conta de comerciante, insira uma URL HTTPS pública, uma descrição e os tipos de evento necessários.",
            "Salve o segredo emitido no armazenamento do lado do servidor. Seu valor completo é mostrado uma única vez.",
            "Verifique assinaturas sobre os bytes originais da solicitação.",
            "Execute a verificação do endpoint. Para endpoint.verification, retorne JSON ecoando data.challenge: {\"challenge\":\"o valor recebido\"}.",
            "Ative o endpoint verificado e inspecione o histórico de entrega."
          ],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Webhooks na sua conta",
              "href": "/account#webhooks"
            }
          ]
        },
        {
          "id": "envelope",
          "title": "Envelope de evento",
          "paragraphs": [
            "id permanece o mesmo em cada tentativa de entrega de um evento. createdAt é um timestamp Unix em milissegundos, e apiVersion identifica a versão do contrato. data contém o objeto de servidor persistido; o exemplo foi encurtado.",
            "livemode=true distingue um evento de servidor real de uma verificação de endpoint. Isso não significa que uma fatura foi paga: verifique o tipo e os dados de pagamento. Trate tipos de evento conhecidos e valide o esquema."
          ],
          "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": "Verifique HMAC-SHA256",
          "paragraphs": [
            "Kevmi-Signature contém t=segundos,v1=hex. A assinatura é HMAC-SHA256 sobre a string de timestamp, um ponto e o corpo original: timestamp + \".\" + rawBody. Use o segredo específico do endpoint e uma comparação em tempo constante.",
            "Rejeite assinaturas cujo timestamp difira do horário do servidor por mais de 300 segundos em qualquer direção. Sincronize relógios. Não analise e reserialize JSON antes da verificação: espaços em branco e ordem de propriedades afetam os bytes assinados."
          ],
          "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": "Este exemplo cobre a verificação de assinatura. Seu servidor HTTP também precisa de um limite de tamanho de corpo, validação de esquema e persistência transacional de eventos.",
          "links": []
        },
        {
          "id": "delivery",
          "title": "Tentativas e reconhecimento",
          "paragraphs": [
            "Qualquer resposta 2xx reconhece um evento comum. Persista o evento de forma durável antes de responder; trabalho caro pode continuar através da sua própria fila. O timeout de resposta é de oito segundos. Um erro de rede ou resposta não-2xx agenda uma nova tentativa.",
            "Há no máximo seis tentativas: a entrega inicial mais atrasos de um minuto, cinco minutos, 30 minutos, duas horas e 12 horas após falhas sucessivas. Estes são agendamentos de fila, não garantias de horário exato de entrega. Esgotar as tentativas marca a entrega como falha.",
            "A entrega é pelo menos uma vez e não promete ordenação estrita. Persista o ID único do evento na mesma transação da sua atualização de pedido. Um duplicado já aplicado deve receber 2xx sem atender o pedido novamente.",
            "Uma nova tentativa manual reinicia as tentativas de entrega preservando o ID original do evento, o ID de entrega e o corpo exato. Cada tentativa recebe um timestamp de assinatura novo. Pausar um endpoint preserva sua fila; excluí-lo cancela entregas pendentes e com falha."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "reconcile",
          "title": "Histórico de entrega e reconciliação",
          "paragraphs": [
            "A interface mostra o estado do endpoint, entregas recentes, contagens de tentativas, última resposta HTTP, erro e próximo horário de tentativa. Estes diagnósticos complementam seus próprios registros de pedidos.",
            "GET /api/v1/events com events:read retorna até 50 eventos e nextCursor. Passe o nextCursor opaco inalterado como cursor; null marca o fim. A ordenação usa tanto createdAt quanto id. O before legado no limite de milissegundos Unix permanece disponível separadamente e não pode ser combinado com cursor. Endpoints verificados recebem eventos assinados no máximo a partir do registro; endpoints pausados continuam acumulando eventos enfileirados para entrega após retomar. Isso não promete histórico anterior à criação do endpoint."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Chaves de API e criação de fatura",
              "href": "/docs/payment-links-api"
            }
          ]
        },
        {
          "id": "gateway",
          "title": "Verificações de recebimento do gateway de entrada",
          "paragraphs": [
            "Gateway v3 envia para /api/gateway/webhook com X-Gateway-Event-Id, X-Gateway-Timestamp e X-Gateway-Signature: v1=<hex>. HMAC-SHA256 assina timestamp + \".\" + rawBody com GATEWAY_WEBHOOK_SECRET; a janela de relógio é de 300 segundos. Igualdade de ID cabeçalho/corpo, versão de API, modo ao vivo e hash do corpo são verificados.",
            "Um ID de evento reutilizado com bytes de corpo diferentes é rejeitado. Uma notificação assinada aciona um GET autenticado da operação exata. Ordem, método, moeda, base, total aprovado e versão são verificados. Sucesso exige fulfillment_ready=true, verification=provider_confirmed, o valor pago exato e nenhuma disputa; cripto também precisa de evidência de liquidação confirmada.",
            "Tratamento de entrada, recibos e eventos de comerciante são protegidos contra duplicados. Formatos antigos de notificação apenas para navegador não podem estabelecer pagamento bem-sucedido. Webhooks de comerciante nunca contêm campos de cartão, códigos bancários, dados de QR, credenciais do provedor ou o segredo do gateway."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "telegram",
          "title": "Telegram tem um contrato separado",
          "paragraphs": [
            "POST /api/telegram/webhook verifica X-Telegram-Bot-Api-Secret-Token, a estrutura do update e o remetente. update_id protege contra processamento duplicado. Esta rota trata login, comandos, suporte e ações de moderação; ela não aceita recibos financeiros.",
            "O proprietário da implantação configura o token do bot, o segredo do webhook, o registro setWebhook e o endereço HTTPS acessível. Eles são separados do segredo de assinatura do endpoint do comerciante."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "stores-usd",
          "title": "Múltiplas lojas e um preço base em USD",
          "paragraphs": [
            "Escolha Todas as lojas para análises e operações agregadas, ou selecione uma loja para seus próprios registros. Cada loja tem um storeId separado, nome, padrão de IVA, faturas, chaves de API, endpoints de webhook, histórico de eventos e aplicativo de site. Notificações e tickets de suporte pertencem à conta. Uma conta pode criar até 100 lojas. Registros existentes permanecem na primeira loja.",
            "As faturas do novo workspace usam pricingMode=\"universal\" e um preço base em USD. O plano Any inclui cartão, alipay, sbp e cripto; um comerciante pode selecionar um subconjunto. Cartões e Alipay cobram em USD. O SBP cobra em RUB usando a taxa de referência USD/RUB do Banco da Rússia. Cripto cobra USDT sob a regra explícita de fatura 1 USD = 1 USDT. Esta é uma regra de conversão de fatura, não uma cotação de mercado de USDT. O gateway fornece a taxa da moeda selecionada, o valor exato da transferência e instruções antes da transferência.",
            "A taxa de referência e ambos os valores são congelados na criação. Faturas que envolvem conversão RUB expiram dentro de 24 horas. Se a taxa de referência não puder ser obtida, a criação falha com FX_UNAVAILABLE; nenhuma taxa de fallback inventada ou desatualizada é usada. O valor do proprietário em minor e cotações usam a moeda contábil USD. quotes[method].settlement contém a cotação de cobrança nativa. O checkout público expõe a moeda de cobrança selecionada em currency, o preço original em baseAmountMinor/baseCurrency, e a taxa de referência em fx. Uma vez que um pagamento foi enviado, seu método não pode ser alterado; uma fatura tem uma operação de gateway.",
            "Crie uma chave de API dentro da loja pretendida e envie Authorization: Bearer <key> do seu servidor. Seu vínculo de loja é imutável; X-Kevmi-Store não pode conceder acesso a outra loja. Sessões de navegador selecionam X-Kevmi-Store: <storeId>; omitir seleciona a primeira loja. O valor all é aceito apenas por GET /api/account/dashboard e GET /api/payment-links. Mutações exigem uma loja selecionada, Origin e X-CSRF-Token. IDs de conta e IDs de loja são identificadores diferentes.",
            "Para compatibilidade, solicitações de API sem pricingMode=\"universal\" mantêm preço nativo e as restrições originais de moeda. Faturas existentes nunca são recalculadas. Recibos confirmados nas análises refletem pagamentos verificados menos despesas de fatura salvas; eles não são um saldo sacável. Moedas de fatura legadas permanecem separadas e pagamentos são combinados com o suporte. Cumpra um pedido somente após verificar payment.fulfillmentReady=true e payment.status=\"succeeded\" através da API do servidor, histórico de eventos ou um webhook assinado."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        }
      ],
      "group": "developers",
      "url": "/docs/webhooks",
      "body": "De onde vêm os eventos\n\ninvoice.created não significa pago. Eventos de pagamento vêm de uma operação de servidor verificada após uma leitura atual do gateway; um nome de evento recebido sozinho é insuficiente.\n\nEntrada Gateway → Kevmi e entrega Kevmi → comerciante são pernas diferentes com segredos separados. O navegador, a navegação de retorno e mensagens de widget não definem estado financeiro.\n\nEvento · Fonte\ninvoice.created · Fatura persistida\ninvoice.updated · Disponibilidade do link alterada\npayment.succeeded · Pagamento exato verificado pelo servidor\npayment.failed · Operação falha verificada\npayment.refunded · Reembolso total verificado\npayment.partially_refunded · Reembolso parcial verificado\npayment.disputed · Disputa verificada\npayment.review_required · Operação requer revisão adicional\n\nRegistrar e verificar um endpoint\n\nURLs não podem apontar para endereços IP, localhost, redes privadas, portas não padrão ou conter credenciais. DNS é verificado antes da entrega; solicitações POST de saída não seguem redirecionamentos. Uma conta pode registrar até cinco endpoints.\n\nO evento de verificação tem livemode=false. Um status HTTP de sucesso sozinho é insuficiente: o desafio deve coincidir exatamente. Girar o segredo exige nova verificação.\n\nEm /account#webhooks na sua conta de comerciante, insira uma URL HTTPS pública, uma descrição e os tipos de evento necessários.\n\nSalve o segredo emitido no armazenamento do lado do servidor. Seu valor completo é mostrado uma única vez.\n\nVerifique assinaturas sobre os bytes originais da solicitação.\n\nExecute a verificação do endpoint. Para endpoint.verification, retorne JSON ecoando data.challenge: {\"challenge\":\"o valor recebido\"}.\n\nAtive o endpoint verificado e inspecione o histórico de entrega.\n\nWebhooks na sua conta\n\nEnvelope de evento\n\nid permanece o mesmo em cada tentativa de entrega de um evento. createdAt é um timestamp Unix em milissegundos, e apiVersion identifica a versão do contrato. data contém o objeto de servidor persistido; o exemplo foi encurtado.\n\nlivemode=true distingue um evento de servidor real de uma verificação de endpoint. Isso não significa que uma fatura foi paga: verifique o tipo e os dados de pagamento. Trate tipos de evento conhecidos e valide o esquema.\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\nVerifique HMAC-SHA256\n\nKevmi-Signature contém t=segundos,v1=hex. A assinatura é HMAC-SHA256 sobre a string de timestamp, um ponto e o corpo original: timestamp + \".\" + rawBody. Use o segredo específico do endpoint e uma comparação em tempo constante.\n\nRejeite assinaturas cujo timestamp difira do horário do servidor por mais de 300 segundos em qualquer direção. Sincronize relógios. Não analise e reserialize JSON antes da verificação: espaços em branco e ordem de propriedades afetam os bytes assinados.\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\nEste exemplo cobre a verificação de assinatura. Seu servidor HTTP também precisa de um limite de tamanho de corpo, validação de esquema e persistência transacional de eventos.\n\nTentativas e reconhecimento\n\nQualquer resposta 2xx reconhece um evento comum. Persista o evento de forma durável antes de responder; trabalho caro pode continuar através da sua própria fila. O timeout de resposta é de oito segundos. Um erro de rede ou resposta não-2xx agenda uma nova tentativa.\n\nHá no máximo seis tentativas: a entrega inicial mais atrasos de um minuto, cinco minutos, 30 minutos, duas horas e 12 horas após falhas sucessivas. Estes são agendamentos de fila, não garantias de horário exato de entrega. Esgotar as tentativas marca a entrega como falha.\n\nA entrega é pelo menos uma vez e não promete ordenação estrita. Persista o ID único do evento na mesma transação da sua atualização de pedido. Um duplicado já aplicado deve receber 2xx sem atender o pedido novamente.\n\nUma nova tentativa manual reinicia as tentativas de entrega preservando o ID original do evento, o ID de entrega e o corpo exato. Cada tentativa recebe um timestamp de assinatura novo. Pausar um endpoint preserva sua fila; excluí-lo cancela entregas pendentes e com falha.\n\nHistórico de entrega e reconciliação\n\nA interface mostra o estado do endpoint, entregas recentes, contagens de tentativas, última resposta HTTP, erro e próximo horário de tentativa. Estes diagnósticos complementam seus próprios registros de pedidos.\n\nGET /api/v1/events com events:read retorna até 50 eventos e nextCursor. Passe o nextCursor opaco inalterado como cursor; null marca o fim. A ordenação usa tanto createdAt quanto id. O before legado no limite de milissegundos Unix permanece disponível separadamente e não pode ser combinado com cursor. Endpoints verificados recebem eventos assinados no máximo a partir do registro; endpoints pausados continuam acumulando eventos enfileirados para entrega após retomar. Isso não promete histórico anterior à criação do endpoint.\n\nChaves de API e criação de fatura\n\nVerificações de recebimento do gateway de entrada\n\nGateway v3 envia para /api/gateway/webhook com X-Gateway-Event-Id, X-Gateway-Timestamp e X-Gateway-Signature: v1=<hex>. HMAC-SHA256 assina timestamp + \".\" + rawBody com GATEWAY_WEBHOOK_SECRET; a janela de relógio é de 300 segundos. Igualdade de ID cabeçalho/corpo, versão de API, modo ao vivo e hash do corpo são verificados.\n\nUm ID de evento reutilizado com bytes de corpo diferentes é rejeitado. Uma notificação assinada aciona um GET autenticado da operação exata. Ordem, método, moeda, base, total aprovado e versão são verificados. Sucesso exige fulfillment_ready=true, verification=provider_confirmed, o valor pago exato e nenhuma disputa; cripto também precisa de evidência de liquidação confirmada.\n\nTratamento de entrada, recibos e eventos de comerciante são protegidos contra duplicados. Formatos antigos de notificação apenas para navegador não podem estabelecer pagamento bem-sucedido. Webhooks de comerciante nunca contêm campos de cartão, códigos bancários, dados de QR, credenciais do provedor ou o segredo do gateway.\n\nTelegram tem um contrato separado\n\nPOST /api/telegram/webhook verifica X-Telegram-Bot-Api-Secret-Token, a estrutura do update e o remetente. update_id protege contra processamento duplicado. Esta rota trata login, comandos, suporte e ações de moderação; ela não aceita recibos financeiros.\n\nO proprietário da implantação configura o token do bot, o segredo do webhook, o registro setWebhook e o endereço HTTPS acessível. Eles são separados do segredo de assinatura do endpoint do comerciante.\n\nMúltiplas lojas e um preço base em USD\n\nEscolha Todas as lojas para análises e operações agregadas, ou selecione uma loja para seus próprios registros. Cada loja tem um storeId separado, nome, padrão de IVA, faturas, chaves de API, endpoints de webhook, histórico de eventos e aplicativo de site. Notificações e tickets de suporte pertencem à conta. Uma conta pode criar até 100 lojas. Registros existentes permanecem na primeira loja.\n\nAs faturas do novo workspace usam pricingMode=\"universal\" e um preço base em USD. O plano Any inclui cartão, alipay, sbp e cripto; um comerciante pode selecionar um subconjunto. Cartões e Alipay cobram em USD. O SBP cobra em RUB usando a taxa de referência USD/RUB do Banco da Rússia. Cripto cobra USDT sob a regra explícita de fatura 1 USD = 1 USDT. Esta é uma regra de conversão de fatura, não uma cotação de mercado de USDT. O gateway fornece a taxa da moeda selecionada, o valor exato da transferência e instruções antes da transferência.\n\nA taxa de referência e ambos os valores são congelados na criação. Faturas que envolvem conversão RUB expiram dentro de 24 horas. Se a taxa de referência não puder ser obtida, a criação falha com FX_UNAVAILABLE; nenhuma taxa de fallback inventada ou desatualizada é usada. O valor do proprietário em minor e cotações usam a moeda contábil USD. quotes[method].settlement contém a cotação de cobrança nativa. O checkout público expõe a moeda de cobrança selecionada em currency, o preço original em baseAmountMinor/baseCurrency, e a taxa de referência em fx. Uma vez que um pagamento foi enviado, seu método não pode ser alterado; uma fatura tem uma operação de gateway.\n\nCrie uma chave de API dentro da loja pretendida e envie Authorization: Bearer <key> do seu servidor. Seu vínculo de loja é imutável; X-Kevmi-Store não pode conceder acesso a outra loja. Sessões de navegador selecionam X-Kevmi-Store: <storeId>; omitir seleciona a primeira loja. O valor all é aceito apenas por GET /api/account/dashboard e GET /api/payment-links. Mutações exigem uma loja selecionada, Origin e X-CSRF-Token. IDs de conta e IDs de loja são identificadores diferentes.\n\nPara compatibilidade, solicitações de API sem pricingMode=\"universal\" mantêm preço nativo e as restrições originais de moeda. Faturas existentes nunca são recalculadas. Recibos confirmados nas análises refletem pagamentos verificados menos despesas de fatura salvas; eles não são um saldo sacável. Moedas de fatura legadas permanecem separadas e pagamentos são combinados com o suporte. Cumpra um pedido somente após verificar payment.fulfillmentReady=true e payment.status=\"succeeded\" através da API do servidor, histórico de eventos ou um webhook assinado.",
      "readMinutes": 7
    },
    {
      "id": "limits",
      "title": "Limites e disponibilidade",
      "summary": "A disponibilidade de pagamento depende do método, valor, país e dos termos de uma fatura específica. Verifique o total, restrições e tempo de processamento aplicável antes da confirmação.",
      "group": "payments",
      "url": "/docs/limits",
      "tags": [
        "limite",
        "tempo de processamento",
        "retenção",
        "reembolso",
        "estorno (chargeback)",
        "restrição"
      ],
      "sections": [
        {
          "id": "pending",
          "title": "Limites de adaptador e canal",
          "paragraphs": [
            "Kevmi verifica as faixas abaixo antes de criar uma operação. Um canal de pagamento pode impor restrições adicionais; um valor dentro da faixa não garante aprovação. Alterar a configuração do gateway não altera automaticamente os limites da Kevmi.",
            "Um novo pagamento e uma intenção de cartão exigem que a solicitação mais recente de revisão do site do comerciante seja aprovada. A aprovação por si só não conecta o gateway de pagamento. Se a revisão mudar após o envio, a operação existente permanece disponível para leitura de status, conciliação e um código bancário solicitado."
          ],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Método",
              "Valor verificado",
              "Faixa Kevmi"
            ],
            "rows": [
              [
                "Cartão / Alipay",
                "Preço base USD",
                "$1–$1,000"
              ],
              [
                "SBP",
                "Total do cliente RUB",
                "₽1–₽100,000"
              ],
              [
                "Cripto",
                "Total do cliente USDT",
                "1–1.000.000 USDT + limites da rede selecionada"
              ]
            ]
          },
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "validation",
          "title": "Validação não é um limite comercial",
          "paragraphs": [
            "A calculadora e a API rejeitam valores negativos, moedas inválidas e cálculos onde a taxa alocada do comerciante e o IVA excedem o valor base. Essas verificações protegem a correção dos dados.",
            "Passar na validação aritmética não garante que um provedor possa aceitar o pagamento. Limites comerciais e de risco são verificados separadamente pelo canal de pagamento."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "refunds",
          "title": "Reembolsos e transações disputadas",
          "paragraphs": [
            "Reembolsos verificados, reembolsos parciais, disputas e estados de revisão aparecem na operação e nos eventos do comerciante. Isso não implica que criar um reembolso ou pagamento está implementado na conta.",
            "Não atenda novamente para payment.partially_refunded, payment.refunded, payment.disputed ou payment.review_required. Preserve a associação original de pedido/pagamento e encaminhe casos disputados a um operador autorizado."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "subscriptions",
          "title": "Cobranças recorrentes",
          "paragraphs": [
            "Kevmi não tem assinaturas ou pagamentos recorrentes. Salvar um link de pedido não autoriza uma cobrança automática futura. Cada novo pedido é pago separadamente."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "ready",
          "title": "Verificações de prontidão",
          "paragraphs": [
            "gateway.configured em /api/config reporta as configurações necessárias do gateway, enquanto /api/health verifica o armazenamento do servidor. Nenhum deles estabelece conectividade com um provedor de pagamento. Use invoice.availability em GET /api/checkout/{token} para os termos de uma fatura específica; o sucesso do pagamento é verificado separadamente contra a operação do gateway."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Requisitos de integração",
              "href": "/docs/gateway"
            },
            {
              "label": "Pergunte sobre o seu caso de uso",
              "href": "/?support=open"
            }
          ]
        }
      ],
      "body": "Limites de adaptador e canal\n\nKevmi verifica as faixas abaixo antes de criar uma operação. Um canal de pagamento pode impor restrições adicionais; um valor dentro da faixa não garante aprovação. Alterar a configuração do gateway não altera automaticamente os limites da Kevmi.\n\nUm novo pagamento e uma intenção de cartão exigem que a solicitação mais recente de revisão do site do comerciante seja aprovada. A aprovação por si só não conecta o gateway de pagamento. Se a revisão mudar após o envio, a operação existente permanece disponível para leitura de status, conciliação e um código bancário solicitado.\n\nMétodo · Valor verificado · Faixa Kevmi\nCartão / Alipay · Preço base USD · $1–$1,000\nSBP · Total do cliente RUB · ₽1–₽100,000\nCripto · Total do cliente USDT · 1–1.000.000 USDT + limites da rede selecionada\n\nValidação não é um limite comercial\n\nA calculadora e a API rejeitam valores negativos, moedas inválidas e cálculos onde a taxa alocada do comerciante e o IVA excedem o valor base. Essas verificações protegem a correção dos dados.\n\nPassar na validação aritmética não garante que um provedor possa aceitar o pagamento. Limites comerciais e de risco são verificados separadamente pelo canal de pagamento.\n\nReembolsos e transações disputadas\n\nReembolsos verificados, reembolsos parciais, disputas e estados de revisão aparecem na operação e nos eventos do comerciante. Isso não implica que criar um reembolso ou pagamento está implementado na conta.\n\nNão atenda novamente para payment.partially_refunded, payment.refunded, payment.disputed ou payment.review_required. Preserve a associação original de pedido/pagamento e encaminhe casos disputados a um operador autorizado.\n\nCobranças recorrentes\n\nKevmi não tem assinaturas ou pagamentos recorrentes. Salvar um link de pedido não autoriza uma cobrança automática futura. Cada novo pedido é pago separadamente.\n\nVerificações de prontidão\n\ngateway.configured em /api/config reporta as configurações necessárias do gateway, enquanto /api/health verifica o armazenamento do servidor. Nenhum deles estabelece conectividade com um provedor de pagamento. Use invoice.availability em GET /api/checkout/{token} para os termos de uma fatura específica; o sucesso do pagamento é verificado separadamente contra a operação do gateway.\n\nRequisitos de integração\n\nPergunte sobre o seu caso de uso",
      "readMinutes": 3
    },
    {
      "id": "agent-access",
      "title": "Recursos para motores de busca e IA",
      "summary": "Informações públicas da Kevmi estão disponíveis em HTML renderizado no servidor, texto simples e formatos estruturados. Esses formatos compartilham uma versão de conhecimento e os mesmos fatos comerciais.",
      "group": "developers",
      "url": "/docs/agent-access",
      "tags": [
        "SEO",
        "indexing",
        "llms",
        "robots",
        "sitemap",
        "agente",
        "JSON"
      ],
      "sections": [
        {
          "id": "files",
          "title": "Recursos públicos",
          "paragraphs": [],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Endereço",
              "Conteúdo"
            ],
            "rows": [
              [
                "/docs e /en/docs",
                "Edições completas do guia em russo e inglês"
              ],
              [
                "/llms.txt",
                "Índice em inglês e fatos essenciais"
              ],
              [
                "/llms-full.txt",
                "Texto completo do conhecimento em inglês"
              ],
              [
                "/knowledge.json",
                "Fatos, taxas, artigos e versão"
              ],
              [
                "/openapi.json",
                "Contrato de API do servidor implementado"
              ],
              [
                "/sitemap.xml",
                "Páginas públicas publicadas"
              ],
              [
                "/robots.txt",
                "Diretrizes do rastreador"
              ]
            ]
          },
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "facts",
          "title": "Leitura de fatos estruturados",
          "paragraphs": [
            "knowledge.facts.countries.card descreve a cobertura mundial com restrições explícitas. countryCount conta as entradas do diretório, coverageLabel é 190+ e exactList contém as entradas ISO suportadas. restrictions preserva a lista de exclusões do provedor.",
            "source=owner_provided e status=owner_list_received registram a origem da lista. independentlyVerified=false e verifiedCountryCount=null significam que a lista não foi verificada de forma independente contra um gateway ativo; ela ainda é uma lista recebida e publicada.",
            "partialCoverage contém ** países com cobertura de localização incompleta. unresolvedFootnotes preserva o marcador separado * para a China. coverage=listed significa inclusão na lista; partial_locations denota restrições de localização; footnote_pending denota o significado separado não confirmado de um marcador. None garante a aprovação de cada cartão.",
            "gatewayConnected=null e gatewayIntegration.liveConfigurationProvided=null significam que a base de conhecimento estática não contém o estado atual de uma implantação. gatewayIntegration.availability identifica os endpoints para verificações atuais. gateway.configured em /api/config relata configurações, não conectividade do provedor. invoice.availability na resposta de checkout descreve os termos de fatura elegíveis, enquanto o campo de compatibilidade invoice.gatewayConnected espelha availability.available. Nenhum deles substitui a confirmação operacional. gatewayIntegration.adapterImplemented=true descreve o suporte ao protocolo v3; subscriptionsSupported=false exclui cobranças recorrentes."
          ],
          "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": "Limites das informações públicas",
          "paragraphs": [
            "Texto simples e JSON não contêm sessões, tokens, solicitações de suporte privadas, registros de pagamento do usuário ou segredos de integração. Páginas de login, conta e checkout são excluídas da indexação de busca.",
            "Ler documentação pública não concede permissões de gerenciamento de loja. Registros pessoais exigem uma sessão válida e mutações exigem verificações adicionais no servidor."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "updates",
          "title": "Atualizações e citações",
          "paragraphs": [
            "Artigos têm IDs estáveis, URLs, títulos e uma data de atualização. Vincule ao guia relevante ao citar uma resposta e preserve as qualificações sobre as condições das transações.",
            "Sitemaps, recursos llms e HTML renderizado no servidor facilitam a extração de conteúdo. Eles não garantem indexação, posição nos resultados de busca ou uso por um sistema de IA externo.",
            "Somente traduções publicadas têm URLs canônicas, alternativas hreflang e entradas de sitemap. Uma localidade configurada para tradução futura não é uma edição de idioma publicada."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "assistant-admin-v16",
          "title": "Assistente, suporte e administração de projetos",
          "paragraphs": [
            "Um primeiro login pelo Telegram cria uma conta e uma loja rascunho com status not_submitted, não um comerciante aprovado. A conta abre o formulário de inscrição para revisão atual; aceitar pagamentos requer aprovação de especialista. Cada nova loja tem sua própria revisão. GET /api/stores retorna reviewStatus e applicationId. Lojas conectadas mantêm acesso agregado, e suporte e documentação permanecem disponíveis durante a revisão.",
            "Ativar Permitir acesso aos meus dados no chat quando precisar de ajuda com operações privadas. Uma solicitação da web com includeAccount=true exige uma sessão válida, Origin e X-CSRF-Token; X-Kevmi-Store seleciona uma loja própria ou todas as lojas próprias. Sem permissão, o assistente usa documentação pública. No Telegram, um botão separado permite o acesso depois que o remetente for identificado.",
            "A ferramenta read_account lê lojas próprias, faturas com status de recebimento verificado, eventos, aplicativos e solicitações de suporte com respostas de especialistas. Ela retorna 30 registros e nextPage; registros mais antigos estão disponíveis por paginação. As leituras por resposta são limitadas, portanto uma amostra incompleta deve ser divulgada. Chaves de API, segredos de webhook, detalhes de cartão e sessões não são fornecidos à ferramenta. Ela não pode cobrar, pagar, reembolsar ou alterar configurações.",
            "Criar uma solicitação de suporte no espaço de trabalho ou no Telegram coloca um alerta separado de administrador em uma fila durável. Ela vincula a /admin/tickets?ticket=<id>; falhas temporárias do Telegram são repetidas. A recuperação também pega solicitações abertas mais antigas sem alerta. Os administradores respondem na página da solicitação; a resposta é salva no espaço de trabalho do usuário e enviada pelo Telegram quando as notificações de suporte estão ativadas.",
            "O bot usa botões em linha para o menu principal, lojas, notificações, suporte, segurança e idioma. A navegação edita a mensagem atual; um menu antigo indisponível é substituído. Notificações de pagamento e segurança não são tratadas como navegação descartável. Sair pelo menu exige confirmação. O comando explícito /logout ainda encerra todas as sessões da conta.",
            "O painel /admin/project é restrito a IDs do Telegram na lista de permissão MODERATOR_TELEGRAM_IDS no lado do servidor. Inclui usuários, lojas, operações, revogação de chaves, desativação de webhooks, pausa de faturas, controles de aceitação e um registro de auditoria. Mutações exigem CSRF e um motivo. O painel não pode restringir um administrador nem declarar manualmente um pagamento como bem-sucedido. Restringir um proprietário encerra sessões e bloqueia o acesso a chaves de API; restringir uma loja interrompe novas operações. O histórico é mantido.",
            "A oferta pública está disponível em /public-offer e a política de privacidade em /privacy-policy em todos os idiomas habilitados. Pesquise moedas por nome ou ticker. Um seletor de rede aparece somente quando várias redes ativas estão disponíveis. Uma única rede é selecionada automaticamente e permanece nomeada na confirmação. A disponibilidade ao vivo do gateway determina os pares selecionáveis; o catálogo de referência não habilita um serviço.",
            "Use update.sh para lançamentos de rotina do app da web: compile o candidato, verifique o histórico de migrações, faça backup do SQLite online, inicie um segundo contêiner, verifique-o e alterne o Caddy sem interrupção. Gateway, PostgreSQL e e-mail não são reiniciados. Ativos estáticos anteriores permanecem disponíveis para abas abertas. Uma nova migração exige autorização revisada explícita; uma mudança incompatível de esquema não é uma implantação sem interrupção."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Oferta pública",
              "href": "/public-offer"
            },
            {
              "label": "Política de privacidade",
              "href": "/privacy-policy"
            }
          ]
        }
      ],
      "body": "Recursos públicos\n\nEndereço · Conteúdo\n/docs e /en/docs · Edições completas do guia em russo e inglês\n/llms.txt · Índice em inglês e fatos essenciais\n/llms-full.txt · Texto completo do conhecimento em inglês\n/knowledge.json · Fatos, taxas, artigos e versão\n/openapi.json · Contrato de API do servidor implementado\n/sitemap.xml · Páginas públicas publicadas\n/robots.txt · Diretrizes do rastreador\n\nLeitura de fatos estruturados\n\nknowledge.facts.countries.card descreve a cobertura mundial com restrições explícitas. countryCount conta as entradas do diretório, coverageLabel é 190+ e exactList contém as entradas ISO suportadas. restrictions preserva a lista de exclusões do provedor.\n\nsource=owner_provided e status=owner_list_received registram a origem da lista. independentlyVerified=false e verifiedCountryCount=null significam que a lista não foi verificada de forma independente contra um gateway ativo; ela ainda é uma lista recebida e publicada.\n\npartialCoverage contém ** países com cobertura de localização incompleta. unresolvedFootnotes preserva o marcador separado * para a China. coverage=listed significa inclusão na lista; partial_locations denota restrições de localização; footnote_pending denota o significado separado não confirmado de um marcador. None garante a aprovação de cada cartão.\n\ngatewayConnected=null e gatewayIntegration.liveConfigurationProvided=null significam que a base de conhecimento estática não contém o estado atual de uma implantação. gatewayIntegration.availability identifica os endpoints para verificações atuais. gateway.configured em /api/config relata configurações, não conectividade do provedor. invoice.availability na resposta de checkout descreve os termos de fatura elegíveis, enquanto o campo de compatibilidade invoice.gatewayConnected espelha availability.available. Nenhum deles substitui a confirmação operacional. gatewayIntegration.adapterImplemented=true descreve o suporte ao protocolo v3; subscriptionsSupported=false exclui cobranças recorrentes.\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\nLimites das informações públicas\n\nTexto simples e JSON não contêm sessões, tokens, solicitações de suporte privadas, registros de pagamento do usuário ou segredos de integração. Páginas de login, conta e checkout são excluídas da indexação de busca.\n\nLer documentação pública não concede permissões de gerenciamento de loja. Registros pessoais exigem uma sessão válida e mutações exigem verificações adicionais no servidor.\n\nAtualizações e citações\n\nArtigos têm IDs estáveis, URLs, títulos e uma data de atualização. Vincule ao guia relevante ao citar uma resposta e preserve as qualificações sobre as condições das transações.\n\nSitemaps, recursos llms e HTML renderizado no servidor facilitam a extração de conteúdo. Eles não garantem indexação, posição nos resultados de busca ou uso por um sistema de IA externo.\n\nSomente traduções publicadas têm URLs canônicas, alternativas hreflang e entradas de sitemap. Uma localidade configurada para tradução futura não é uma edição de idioma publicada.\n\nAssistente, suporte e administração de projetos\n\nUm primeiro login pelo Telegram cria uma conta e uma loja rascunho com status not_submitted, não um comerciante aprovado. A conta abre o formulário de inscrição para revisão atual; aceitar pagamentos requer aprovação de especialista. Cada nova loja tem sua própria revisão. GET /api/stores retorna reviewStatus e applicationId. Lojas conectadas mantêm acesso agregado, e suporte e documentação permanecem disponíveis durante a revisão.\n\nAtivar Permitir acesso aos meus dados no chat quando precisar de ajuda com operações privadas. Uma solicitação da web com includeAccount=true exige uma sessão válida, Origin e X-CSRF-Token; X-Kevmi-Store seleciona uma loja própria ou todas as lojas próprias. Sem permissão, o assistente usa documentação pública. No Telegram, um botão separado permite o acesso depois que o remetente for identificado.\n\nA ferramenta read_account lê lojas próprias, faturas com status de recebimento verificado, eventos, aplicativos e solicitações de suporte com respostas de especialistas. Ela retorna 30 registros e nextPage; registros mais antigos estão disponíveis por paginação. As leituras por resposta são limitadas, portanto uma amostra incompleta deve ser divulgada. Chaves de API, segredos de webhook, detalhes de cartão e sessões não são fornecidos à ferramenta. Ela não pode cobrar, pagar, reembolsar ou alterar configurações.\n\nCriar uma solicitação de suporte no espaço de trabalho ou no Telegram coloca um alerta separado de administrador em uma fila durável. Ela vincula a /admin/tickets?ticket=<id>; falhas temporárias do Telegram são repetidas. A recuperação também pega solicitações abertas mais antigas sem alerta. Os administradores respondem na página da solicitação; a resposta é salva no espaço de trabalho do usuário e enviada pelo Telegram quando as notificações de suporte estão ativadas.\n\nO bot usa botões em linha para o menu principal, lojas, notificações, suporte, segurança e idioma. A navegação edita a mensagem atual; um menu antigo indisponível é substituído. Notificações de pagamento e segurança não são tratadas como navegação descartável. Sair pelo menu exige confirmação. O comando explícito /logout ainda encerra todas as sessões da conta.\n\nO painel /admin/project é restrito a IDs do Telegram na lista de permissão MODERATOR_TELEGRAM_IDS no lado do servidor. Inclui usuários, lojas, operações, revogação de chaves, desativação de webhooks, pausa de faturas, controles de aceitação e um registro de auditoria. Mutações exigem CSRF e um motivo. O painel não pode restringir um administrador nem declarar manualmente um pagamento como bem-sucedido. Restringir um proprietário encerra sessões e bloqueia o acesso a chaves de API; restringir uma loja interrompe novas operações. O histórico é mantido.\n\nA oferta pública está disponível em /public-offer e a política de privacidade em /privacy-policy em todos os idiomas habilitados. Pesquise moedas por nome ou ticker. Um seletor de rede aparece somente quando várias redes ativas estão disponíveis. Uma única rede é selecionada automaticamente e permanece nomeada na confirmação. A disponibilidade ao vivo do gateway determina os pares selecionáveis; o catálogo de referência não habilita um serviço.\n\nUse update.sh para lançamentos de rotina do app da web: compile o candidato, verifique o histórico de migrações, faça backup do SQLite online, inicie um segundo contêiner, verifique-o e alterne o Caddy sem interrupção. Gateway, PostgreSQL e e-mail não são reiniciados. Ativos estáticos anteriores permanecem disponíveis para abas abertas. Uma nova migração exige autorização revisada explícita; uma mudança incompatível de esquema não é uma implantação sem interrupção.\n\nOferta pública\n\nPolítica de privacidade",
      "readMinutes": 5
    },
    {
      "id": "cost-sharing",
      "title": "Divida as taxas de processamento e o IVA",
      "summary": "Escolha de forma independente quanto da taxa de processamento e do IVA seu cliente paga em cada fatura. Dois controles deslizantes alocam cada custo de 0 a 100% em etapas de um por cento, com o resultado visível antes de você criar o link.",
      "tags": [
        "compartilhamento de custos",
        "taxa de processamento",
        "IVA",
        "porcentagem",
        "controle deslizante",
        "feeCustomerPercent",
        "vatCustomerPercent"
      ],
      "sections": [
        {
          "id": "controls",
          "title": "Dois controles para um pedido",
          "paragraphs": [
            "O controle de taxa de processamento aloca toda a taxa de aceitação, incluindo seus componentes percentual e fixo. O controle de IVA aloca apenas o imposto. Nenhum controle altera a tarifa, a alíquota de imposto ou o preço base do produto.",
            "Totalmente à esquerda atribui o custo ao cliente; totalmente à direita atribui ao comerciante. Os rótulos mostram as porcentagens exatas de ambas as partes e os valores monetários. Os predefinidos Cliente, Dividir igualmente e Comerciante oferecem uma escolha rápida."
          ],
          "bullets": [
            "A parcela do cliente é adicionada ao total do checkout.",
            "A parcela do comerciante é deduzida do preço base do pedido.",
            "SBP e criptomoeda têm IVA zero, então o controle de IVA não afeta o total deles.",
            "Botões e controles deslizantes funcionam com o teclado; animação não é necessária para entender o resultado."
          ],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Abrir a calculadora",
              "href": "/pricing"
            }
          ]
        },
        {
          "id": "base",
          "title": "Um preço base, dois custos separados",
          "paragraphs": [
            "Cartões internacionais e Alipay custam 10% do preço base mais $0,50, com IVA de 16% do preço base. SBP custa 8% e criptomoeda custa 4%; nenhum tem IVA sob o modelo de preços publicado.",
            "O IVA é adicionado a partir do preço base, não extraído usando 16/116. A taxa não é recalculada sobre um total que inclui IVA ou a parcela da taxa do cliente. A comissão da Kevmi já está incluída na tarifa publicada; outros 5% não são adicionados."
          ],
          "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": "Alocando um pedido de cartão de $5",
          "paragraphs": [
            "Cada exemplo abaixo usa um preço base de $5,00, uma taxa total de cartão de $1,00 e IVA de $0,80. As porcentagens mudam apenas quem cobre esses custos."
          ],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Parcelas do cliente: IVA / taxa",
              "O cliente paga",
              "Comerciante após deduções"
            ],
            "rows": [
              [
                "100% / 0% · padrão original",
                "$5,80",
                "$4,00"
              ],
              [
                "0% / 0% · comerciante cobre tudo",
                "$5,00",
                "$3,20"
              ],
              [
                "100% / 100% · cliente cobre tudo",
                "$6.80",
                "$5,00"
              ],
              [
                "50% / 23% · divisão personalizada",
                "$5.63",
                "$3.83"
              ]
            ]
          },
          "code": null,
          "note": "A tabela ilustra a aritmética da alocação. Destas configurações de cartão, o gateway atual pode executar apenas 100% de IVA do cliente / 0% de taxa do cliente. Este cálculo não inicia um pagamento; não há conversão automática de USD para USDT.",
          "links": []
        },
        {
          "id": "rounding",
          "title": "Arredondamento sem perder um centavo",
          "paragraphs": [
            "Os valores são unidades monetárias menores inteiras. A taxa total e o IVA total são arredondados separadamente primeiro. Cada parcela do cliente usa então arredondamento para cima na metade, e o comerciante recebe o restante exato desse custo. As duas parcelas, portanto, sempre somam o valor original.",
            "Para um custo de um centavo dividido 50/50, ao cliente é alocado um centavo e ao comerciante zero. A porcentagem permanece 50%, enquanto os valores monetários refletem a precisão disponível da moeda. O servidor rejeita cálculos com receita líquida negativa para o comerciante."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "api",
          "title": "Defina a divisão pela API",
          "paragraphs": [
            "Envie vatCustomerPercent e feeCustomerPercent como inteiros de 0 a 100. Cada um se aplica à fatura que está sendo criada. Strings vazias, porcentagens fracionárias e números fora do intervalo são rejeitados.",
            "Omitir feeCustomerPercent atribui toda a taxa ao comerciante. Omitir vatCustomerPercent usa o campo legado vatPayer ou o padrão da conta. Valores legados de cliente e comerciante correspondem a 100% e 0% de IVA do cliente. Não envie valores conflitantes de vatPayer e vatCustomerPercent.",
            "As respostas descrevem uma parcela intermediária de IVA como vatPayer=shared. Use a porcentagem numérica para novas solicitações; shared não é aceito como valor de entrada legado vatPayer."
          ],
          "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": "O exemplo usa a alocação suportada do canal de cartão: todo o IVA para o cliente e a taxa de processamento integral para o comerciante. Salvar outras porcentagens não as torna executáveis.",
          "links": [
            {
              "label": "Crie uma fatura pela API",
              "href": "/docs/payment-links-api"
            }
          ]
        },
        {
          "id": "snapshot",
          "title": "Os termos permanecem com a fatura",
          "paragraphs": [
            "A fatura congela o valor, a moeda, os métodos e ambas as parcelas. Alterar preferências da loja não modifica links emitidos. Os controles deslizantes calculam a alocação; a execução ao vivo depende das capacidades do canal conectado.",
            "Para um novo pagamento ao vivo com cartão ou Alipay, o gateway atual suporta apenas feeCustomerPercent=0 e vatCustomerPercent=100: o comerciante cobre toda a taxa de processamento e o IVA é adicionado integralmente para o cliente. Outras parcelas podem ser salvas e calculadas em uma fatura, mas a execução é bloqueada com unsupported_allocation. O servidor nunca altera silenciosamente os termos salvos. Pagamentos SBP e USDT cripto suportam todas as parcelas de taxa de processamento e não têm IVA."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        }
      ],
      "group": "payments",
      "url": "/docs/cost-sharing",
      "body": "Dois controles para um pedido\n\nO controle de taxa de processamento aloca toda a taxa de aceitação, incluindo seus componentes percentual e fixo. O controle de IVA aloca apenas o imposto. Nenhum controle altera a tarifa, a alíquota de imposto ou o preço base do produto.\n\nTotalmente à esquerda atribui o custo ao cliente; totalmente à direita atribui ao comerciante. Os rótulos mostram as porcentagens exatas de ambas as partes e os valores monetários. Os predefinidos Cliente, Dividir igualmente e Comerciante oferecem uma escolha rápida.\n\nA parcela do cliente é adicionada ao total do checkout.\n\nA parcela do comerciante é deduzida do preço base do pedido.\n\nSBP e criptomoeda têm IVA zero, então o controle de IVA não afeta o total deles.\n\nBotões e controles deslizantes funcionam com o teclado; animação não é necessária para entender o resultado.\n\nAbrir a calculadora\n\nUm preço base, dois custos separados\n\nCartões internacionais e Alipay custam 10% do preço base mais $0,50, com IVA de 16% do preço base. SBP custa 8% e criptomoeda custa 4%; nenhum tem IVA sob o modelo de preços publicado.\n\nO IVA é adicionado a partir do preço base, não extraído usando 16/116. A taxa não é recalculada sobre um total que inclui IVA ou a parcela da taxa do cliente. A comissão da Kevmi já está incluída na tarifa publicada; outros 5% não são adicionados.\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\nAlocando um pedido de cartão de $5\n\nCada exemplo abaixo usa um preço base de $5,00, uma taxa total de cartão de $1,00 e IVA de $0,80. As porcentagens mudam apenas quem cobre esses custos.\n\nParcelas do cliente: IVA / taxa · O cliente paga · Comerciante após deduções\n100% / 0% · padrão original · $5,80 · $4,00\n0% / 0% · comerciante cobre tudo · $5,00 · $3,20\n100% / 100% · cliente cobre tudo · $6.80 · $5,00\n50% / 23% · divisão personalizada · $5.63 · $3.83\n\nA tabela ilustra a aritmética da alocação. Destas configurações de cartão, o gateway atual pode executar apenas 100% de IVA do cliente / 0% de taxa do cliente. Este cálculo não inicia um pagamento; não há conversão automática de USD para USDT.\n\nArredondamento sem perder um centavo\n\nOs valores são unidades monetárias menores inteiras. A taxa total e o IVA total são arredondados separadamente primeiro. Cada parcela do cliente usa então arredondamento para cima na metade, e o comerciante recebe o restante exato desse custo. As duas parcelas, portanto, sempre somam o valor original.\n\nPara um custo de um centavo dividido 50/50, ao cliente é alocado um centavo e ao comerciante zero. A porcentagem permanece 50%, enquanto os valores monetários refletem a precisão disponível da moeda. O servidor rejeita cálculos com receita líquida negativa para o comerciante.\n\nDefina a divisão pela API\n\nEnvie vatCustomerPercent e feeCustomerPercent como inteiros de 0 a 100. Cada um se aplica à fatura que está sendo criada. Strings vazias, porcentagens fracionárias e números fora do intervalo são rejeitados.\n\nOmitir feeCustomerPercent atribui toda a taxa ao comerciante. Omitir vatCustomerPercent usa o campo legado vatPayer ou o padrão da conta. Valores legados de cliente e comerciante correspondem a 100% e 0% de IVA do cliente. Não envie valores conflitantes de vatPayer e vatCustomerPercent.\n\nAs respostas descrevem uma parcela intermediária de IVA como vatPayer=shared. Use a porcentagem numérica para novas solicitações; shared não é aceito como valor de entrada legado vatPayer.\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\nO exemplo usa a alocação suportada do canal de cartão: todo o IVA para o cliente e a taxa de processamento integral para o comerciante. Salvar outras porcentagens não as torna executáveis.\n\nCrie uma fatura pela API\n\nOs termos permanecem com a fatura\n\nA fatura congela o valor, a moeda, os métodos e ambas as parcelas. Alterar preferências da loja não modifica links emitidos. Os controles deslizantes calculam a alocação; a execução ao vivo depende das capacidades do canal conectado.\n\nPara um novo pagamento ao vivo com cartão ou Alipay, o gateway atual suporta apenas feeCustomerPercent=0 e vatCustomerPercent=100: o comerciante cobre toda a taxa de processamento e o IVA é adicionado integralmente para o cliente. Outras parcelas podem ser salvas e calculadas em uma fatura, mas a execução é bloqueada com unsupported_allocation. O servidor nunca altera silenciosamente os termos salvos. Pagamentos SBP e USDT cripto suportam todas as parcelas de taxa de processamento e não têm IVA.",
      "readMinutes": 6
    },
    {
      "id": "widgets",
      "title": "Incorpore o checkout no seu site",
      "summary": "Abra o checkout em um modal, incorpore-o em uma página ou envie o cliente para uma página de pagamento dedicada. O widget usa uma URL de checkout pública e nunca precisa de uma chave de API de comerciante no navegador.",
      "tags": [
        "widget",
        "iframe",
        "incorporar",
        "HTML",
        "integração",
        "modal",
        "checkout"
      ],
      "sections": [
        {
          "id": "flow",
          "title": "Da fatura ao checkout",
          "paragraphs": [
            "Crie uma fatura em /account#links e receba imediatamente checkoutUrl. Abra /account#widget, cole o link e escolha um modal, bloco inline ou redirecionamento. Chaves e webhooks estão disponíveis nas seções vizinhas da conta.",
            "A pré-visualização do construtor sempre usa um pedido de demonstração sem cobrar. O código do widget gerado mantém seu link ativo, cujos termos vêm da fatura salva no servidor.",
            "As faturas do novo workspace usam pricingMode=\"universal\" e um preço base em USD. O plano Any inclui cartão, alipay, sbp e cripto; um comerciante pode selecionar um subconjunto. Cartões e Alipay cobram em USD. O SBP cobra em RUB usando a taxa de referência USD/RUB do Banco da Rússia. Cripto cobra USDT sob a regra explícita de fatura 1 USD = 1 USDT. Esta é uma regra de conversão de fatura, não uma cotação de mercado de USDT. O gateway fornece a taxa da moeda selecionada, o valor exato da transferência e instruções antes da transferência."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Construtor de integração",
              "href": "/account#widget"
            },
            {
              "label": "API de links de pagamento",
              "href": "/docs/payment-links-api"
            }
          ]
        },
        {
          "id": "markup",
          "title": "Um botão com fallback de link normal",
          "paragraphs": [
            "Este exemplo abre uma demonstração sem cobrar dinheiro. Substitua ambos os valores de URL por checkoutUrl da resposta da sua fatura. Carregue o script da mesma origem Kevmi que a URL de checkout.",
            "O href abre o checkout quando o JavaScript está indisponível. data-kevmi-label dá ao iframe um nome acessível. Inclua o script uma vez por página."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": {
            "language": "HTML",
            "code": "<script src=\"https://kevmi.one/widgets/kevmi.js\" defer></script>\n<a href=\"https://kevmi.one/en/pay/demo\"\n   data-kevmi-checkout=\"https://kevmi.one/en/pay/demo\"\n   data-kevmi-mode=\"modal\"\n   data-kevmi-label=\"Order checkout\">Pay securely</a>"
          },
          "note": "",
          "links": []
        },
        {
          "id": "modes",
          "title": "Três maneiras de abrir o checkout",
          "paragraphs": [
            "Use um contêiner como div para o modo inline e substitua CHECKOUT_URL_FROM_API por uma URL real. O quadro se adapta à largura do contêiner; as mensagens de checkout podem redimensionar sua altura dentro de um intervalo limitado.",
            "O modal fecha com seu botão, Escape ou clique no fundo. O foco retorna ao gatilho original após fechar. As configurações de movimento reduzido encurtam a transição."
          ],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "data-kevmi-mode",
              "Comportamento",
              "Útil para"
            ],
            "rows": [
              [
                "modal",
                "Um diálogo sobreposto; o modo padrão",
                "Um botão de pagamento no nível do pedido"
              ],
              [
                "inline",
                "Um iframe dentro do contêiner selecionado",
                "Uma etapa de checkout no seu site"
              ],
              [
                "redirect",
                "Navegação para Kevmi na aba atual",
                "Uma página de pagamento completa"
              ]
            ]
          },
          "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": "Abra o checkout a partir da sua interface",
          "paragraphs": [
            "Os eventos de documento kevmi:opened e kevmi:closed permitem que sua interface reaja à abertura e ao fechamento. Um evento kevmi:error no gatilho relata uma URL de checkout inválida. Nenhum deles comprova pagamento. Chame a API JavaScript depois que o script do widget tiver sido carregado."
          ],
          "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": "O que comprova um pagamento bem-sucedido",
          "paragraphs": [
            "Não coloque chaves de API ou segredos de assinatura em HTML. O widget recebe apenas um link público para uma fatura. O checkout criptografa os dados do cartão e os códigos bancários com a chave do gateway; o servidor Kevmi não os aceita em texto simples.",
            "postMessage atualiza o estado da interface, não a execução do pedido. Verifique a origem da mensagem e a janela de origem antes de processar. Use um evento verificado payment.succeeded ou um status succeeded no resumo GET link.payment do servidor para o resultado final."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "Abrir o checkout, fechar um widget ou retornar ao site do comerciante não comprova que o dinheiro foi recebido.",
          "links": [
            {
              "label": "Assinaturas e entrega de webhooks",
              "href": "/docs/webhooks"
            }
          ]
        },
        {
          "id": "deployment",
          "title": "Antes de adicionar o widget à produção",
          "paragraphs": [],
          "bullets": [
            "Permita a origem Kevmi nas diretivas Content Security Policy script-src e frame-src sem ampliar políticas não relacionadas.",
            "Verifique telas estreitas, acesso por teclado e temas claro e escuro.",
            "Confirme que a fatura está ativa, não expirada e com o preço e as cotas de custo corretos.",
            "Mantenha um link de pagamento comum como fallback.",
            "Teste entregas com falha e eventos de webhook duplicados sem emitir um pedido duas vezes."
          ],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "stores-usd",
          "title": "Múltiplas lojas e um preço base em USD",
          "paragraphs": [
            "Escolha Todas as lojas para análises e operações agregadas, ou selecione uma loja para seus próprios registros. Cada loja tem um storeId separado, nome, padrão de IVA, faturas, chaves de API, endpoints de webhook, histórico de eventos e aplicativo de site. Notificações e tickets de suporte pertencem à conta. Uma conta pode criar até 100 lojas. Registros existentes permanecem na primeira loja.",
            "As faturas do novo workspace usam pricingMode=\"universal\" e um preço base em USD. O plano Any inclui cartão, alipay, sbp e cripto; um comerciante pode selecionar um subconjunto. Cartões e Alipay cobram em USD. O SBP cobra em RUB usando a taxa de referência USD/RUB do Banco da Rússia. Cripto cobra USDT sob a regra explícita de fatura 1 USD = 1 USDT. Esta é uma regra de conversão de fatura, não uma cotação de mercado de USDT. O gateway fornece a taxa da moeda selecionada, o valor exato da transferência e instruções antes da transferência.",
            "A taxa de referência e ambos os valores são congelados na criação. Faturas que envolvem conversão RUB expiram dentro de 24 horas. Se a taxa de referência não puder ser obtida, a criação falha com FX_UNAVAILABLE; nenhuma taxa de fallback inventada ou desatualizada é usada. O valor do proprietário em minor e cotações usam a moeda contábil USD. quotes[method].settlement contém a cotação de cobrança nativa. O checkout público expõe a moeda de cobrança selecionada em currency, o preço original em baseAmountMinor/baseCurrency, e a taxa de referência em fx. Uma vez que um pagamento foi enviado, seu método não pode ser alterado; uma fatura tem uma operação de gateway.",
            "Crie uma chave de API dentro da loja pretendida e envie Authorization: Bearer <key> do seu servidor. Seu vínculo de loja é imutável; X-Kevmi-Store não pode conceder acesso a outra loja. Sessões de navegador selecionam X-Kevmi-Store: <storeId>; omitir seleciona a primeira loja. O valor all é aceito apenas por GET /api/account/dashboard e GET /api/payment-links. Mutações exigem uma loja selecionada, Origin e X-CSRF-Token. IDs de conta e IDs de loja são identificadores diferentes.",
            "Para compatibilidade, solicitações de API sem pricingMode=\"universal\" mantêm preço nativo e as restrições originais de moeda. Faturas existentes nunca são recalculadas. Recibos confirmados nas análises refletem pagamentos verificados menos despesas de fatura salvas; eles não são um saldo sacável. Moedas de fatura legadas permanecem separadas e pagamentos são combinados com o suporte. Cumpra um pedido somente após verificar payment.fulfillmentReady=true e payment.status=\"succeeded\" através da API do servidor, histórico de eventos ou um webhook assinado."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        }
      ],
      "group": "developers",
      "url": "/docs/widgets",
      "body": "Da fatura ao checkout\n\nCrie uma fatura em /account#links e receba imediatamente checkoutUrl. Abra /account#widget, cole o link e escolha um modal, bloco inline ou redirecionamento. Chaves e webhooks estão disponíveis nas seções vizinhas da conta.\n\nA pré-visualização do construtor sempre usa um pedido de demonstração sem cobrar. O código do widget gerado mantém seu link ativo, cujos termos vêm da fatura salva no servidor.\n\nAs faturas do novo workspace usam pricingMode=\"universal\" e um preço base em USD. O plano Any inclui cartão, alipay, sbp e cripto; um comerciante pode selecionar um subconjunto. Cartões e Alipay cobram em USD. O SBP cobra em RUB usando a taxa de referência USD/RUB do Banco da Rússia. Cripto cobra USDT sob a regra explícita de fatura 1 USD = 1 USDT. Esta é uma regra de conversão de fatura, não uma cotação de mercado de USDT. O gateway fornece a taxa da moeda selecionada, o valor exato da transferência e instruções antes da transferência.\n\nConstrutor de integração\n\nAPI de links de pagamento\n\nUm botão com fallback de link normal\n\nEste exemplo abre uma demonstração sem cobrar dinheiro. Substitua ambos os valores de URL por checkoutUrl da resposta da sua fatura. Carregue o script da mesma origem Kevmi que a URL de checkout.\n\nO href abre o checkout quando o JavaScript está indisponível. data-kevmi-label dá ao iframe um nome acessível. Inclua o script uma vez por página.\n\n<script src=\"https://kevmi.one/widgets/kevmi.js\" defer></script>\n<a href=\"https://kevmi.one/en/pay/demo\"\n   data-kevmi-checkout=\"https://kevmi.one/en/pay/demo\"\n   data-kevmi-mode=\"modal\"\n   data-kevmi-label=\"Order checkout\">Pay securely</a>\n\nTrês maneiras de abrir o checkout\n\nUse um contêiner como div para o modo inline e substitua CHECKOUT_URL_FROM_API por uma URL real. O quadro se adapta à largura do contêiner; as mensagens de checkout podem redimensionar sua altura dentro de um intervalo limitado.\n\nO modal fecha com seu botão, Escape ou clique no fundo. O foco retorna ao gatilho original após fechar. As configurações de movimento reduzido encurtam a transição.\n\ndata-kevmi-mode · Comportamento · Útil para\nmodal · Um diálogo sobreposto; o modo padrão · Um botão de pagamento no nível do pedido\ninline · Um iframe dentro do contêiner selecionado · Uma etapa de checkout no seu site\nredirect · Navegação para Kevmi na aba atual · Uma página de pagamento completa\n\n<div data-kevmi-checkout=\"CHECKOUT_URL_FROM_API\"\n     data-kevmi-mode=\"inline\"\n     data-kevmi-label=\"Order checkout\"></div>\n\nAbra o checkout a partir da sua interface\n\nOs eventos de documento kevmi:opened e kevmi:closed permitem que sua interface reaja à abertura e ao fechamento. Um evento kevmi:error no gatilho relata uma URL de checkout inválida. Nenhum deles comprova pagamento. Chame a API JavaScript depois que o script do widget tiver sido carregado.\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\nO que comprova um pagamento bem-sucedido\n\nNão coloque chaves de API ou segredos de assinatura em HTML. O widget recebe apenas um link público para uma fatura. O checkout criptografa os dados do cartão e os códigos bancários com a chave do gateway; o servidor Kevmi não os aceita em texto simples.\n\npostMessage atualiza o estado da interface, não a execução do pedido. Verifique a origem da mensagem e a janela de origem antes de processar. Use um evento verificado payment.succeeded ou um status succeeded no resumo GET link.payment do servidor para o resultado final.\n\nAbrir o checkout, fechar um widget ou retornar ao site do comerciante não comprova que o dinheiro foi recebido.\n\nAssinaturas e entrega de webhooks\n\nAntes de adicionar o widget à produção\n\nPermita a origem Kevmi nas diretivas Content Security Policy script-src e frame-src sem ampliar políticas não relacionadas.\n\nVerifique telas estreitas, acesso por teclado e temas claro e escuro.\n\nConfirme que a fatura está ativa, não expirada e com o preço e as cotas de custo corretos.\n\nMantenha um link de pagamento comum como fallback.\n\nTeste entregas com falha e eventos de webhook duplicados sem emitir um pedido duas vezes.\n\nMúltiplas lojas e um preço base em USD\n\nEscolha Todas as lojas para análises e operações agregadas, ou selecione uma loja para seus próprios registros. Cada loja tem um storeId separado, nome, padrão de IVA, faturas, chaves de API, endpoints de webhook, histórico de eventos e aplicativo de site. Notificações e tickets de suporte pertencem à conta. Uma conta pode criar até 100 lojas. Registros existentes permanecem na primeira loja.\n\nAs faturas do novo workspace usam pricingMode=\"universal\" e um preço base em USD. O plano Any inclui cartão, alipay, sbp e cripto; um comerciante pode selecionar um subconjunto. Cartões e Alipay cobram em USD. O SBP cobra em RUB usando a taxa de referência USD/RUB do Banco da Rússia. Cripto cobra USDT sob a regra explícita de fatura 1 USD = 1 USDT. Esta é uma regra de conversão de fatura, não uma cotação de mercado de USDT. O gateway fornece a taxa da moeda selecionada, o valor exato da transferência e instruções antes da transferência.\n\nA taxa de referência e ambos os valores são congelados na criação. Faturas que envolvem conversão RUB expiram dentro de 24 horas. Se a taxa de referência não puder ser obtida, a criação falha com FX_UNAVAILABLE; nenhuma taxa de fallback inventada ou desatualizada é usada. O valor do proprietário em minor e cotações usam a moeda contábil USD. quotes[method].settlement contém a cotação de cobrança nativa. O checkout público expõe a moeda de cobrança selecionada em currency, o preço original em baseAmountMinor/baseCurrency, e a taxa de referência em fx. Uma vez que um pagamento foi enviado, seu método não pode ser alterado; uma fatura tem uma operação de gateway.\n\nCrie uma chave de API dentro da loja pretendida e envie Authorization: Bearer <key> do seu servidor. Seu vínculo de loja é imutável; X-Kevmi-Store não pode conceder acesso a outra loja. Sessões de navegador selecionam X-Kevmi-Store: <storeId>; omitir seleciona a primeira loja. O valor all é aceito apenas por GET /api/account/dashboard e GET /api/payment-links. Mutações exigem uma loja selecionada, Origin e X-CSRF-Token. IDs de conta e IDs de loja são identificadores diferentes.\n\nPara compatibilidade, solicitações de API sem pricingMode=\"universal\" mantêm preço nativo e as restrições originais de moeda. Faturas existentes nunca são recalculadas. Recibos confirmados nas análises refletem pagamentos verificados menos despesas de fatura salvas; eles não são um saldo sacável. Moedas de fatura legadas permanecem separadas e pagamentos são combinados com o suporte. Cumpra um pedido somente após verificar payment.fulfillmentReady=true e payment.status=\"succeeded\" através da API do servidor, histórico de eventos ou um webhook assinado.",
      "readMinutes": 5
    },
    {
      "id": "applications",
      "title": "Candidate-se para conectar sua loja",
      "summary": "Envie seu site após entrar com Telegram e acompanhe cada etapa de revisão em uma URL privada. Verificações automatizadas apoiam o revisor; um moderador sempre toma a decisão final.",
      "tags": [
        "candidatura",
        "onboarding",
        "moderação",
        "revisão do site",
        "status",
        "Telegram",
        "AI"
      ],
      "sections": [
        {
          "id": "submit",
          "title": "Envie uma candidatura",
          "paragraphs": [
            "As descrições exigem 40–3000 caracteres; os nomes de projeto permitem até 100. O site deve ser acessível sem fazer login. URLs contendo credenciais, hosts privados, portas não padrão ou parâmetros de consulta não são aceitas.",
            "A conta verificada é a proprietária da candidatura. O contato Telegram informado é para comunicação e não muda a propriedade. Encaminhar a URL de rastreamento não concede acesso a outra conta."
          ],
          "bullets": [],
          "steps": [
            "Entre ou registre-se com Telegram e depois abra /account#applications.",
            "Informe um endereço de site HTTPS público, nome do projeto, categoria e uma descrição dos seus produtos ou serviços.",
            "Adicione um contato Telegram. Explique o que os clientes recebem e como os pedidos são atendidos.",
            "Confirme sua autoridade para enviar o site e envie o formulário.",
            "Guarde o endereço /account#applications/{id} que abre imediatamente após o envio."
          ],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Envie seu site",
              "href": "/account#applications"
            }
          ]
        },
        {
          "id": "stages",
          "title": "Quatro etapas de revisão",
          "paragraphs": [
            "A linha de conexão e os marcadores de etapa refletem estados persistidos no servidor. Reabrir a página continua o mesmo processo. Fechar a aba não cancela sua candidatura; trabalhos em segundo plano continuam funcionando e recuperam etapas interrompidas."
          ],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Etapa",
              "O que acontece",
              "Status exibido"
            ],
            "rows": [
              [
                "Candidatura recebida",
                "Os detalhes do envio e o URL privado são salvos",
                "A primeira etapa está concluída"
              ],
              [
                "Revisão de conteúdo",
                "A IA compara a descrição com o conteúdo do site público",
                "Em execução, concluída ou aguardando um especialista"
              ],
              [
                "Verificações técnicas",
                "Disponibilidade e um conjunto limitado de links são examinados",
                "Um resultado separado e o carimbo de data/hora da etapa"
              ],
              [
                "Revisão do especialista",
                "Um moderador revisa o envio e os achados",
                "Aguardando decisão, aprovada ou um motivo de recusa"
              ]
            ]
          },
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "attention",
          "title": "Uma etapa amarela precisa de um especialista",
          "paragraphs": [
            "Um marcador amarelo significa que uma etapa precisa de atenção, por exemplo porque as informações são insuficientes, um link está indisponível ou um resultado automatizado não pode ser aceito com confiança. Não é uma rejeição final. A página de status explica o próximo passo.",
            "Um moderador pode limpar a etapa atual para que a próxima verificação continue. Uma etapa recusada exibe uma cruz e um motivo visível ao usuário que o moderador pode editar antes de enviar. Limpar uma etapa intermediária nunca remove a revisão manual final."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "scope",
          "title": "O que as verificações automatizadas cobrem",
          "paragraphs": [
            "As verificações examinam a página inicial pública: HTTPS, resposta HTTP, título, texto e padrões suspeitos de links. Elas também solicitam cabeçalhos de no máximo três links no mesmo site. A contagem de redirecionamentos, o tamanho da resposta e o tempo de solicitação são limitados.",
            "As verificações não acessam áreas autenticadas, não executam arquivos baixados nem substituem uma auditoria de segurança ou um scanner de malware. Concluir uma etapa não garante que toda página esteja livre de conteúdo malicioso.",
            "O conteúdo do site são dados não confiáveis. Instruções em um site não podem designar um administrador, alterar os termos da Kevmi nem aprovar uma solicitação. IA indisponível e saída de modelo malformada exigem revisão do especialista em vez de passar pela etapa silenciosamente."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "updates",
          "title": "Atualizações do Telegram",
          "paragraphs": [
            "Receber uma solicitação, concluir uma etapa, solicitar atenção do especialista e tomar uma decisão final criam notificações com um link de rastreamento privado. Elas usam a categoria Suporte nas configurações de notificação da conta. Desativar essa categoria interrompe as mensagens.",
            "O evento da solicitação e a entrada da caixa de saída de notificações são confirmados juntos. A entrega via Telegram usa uma fila de tentativas e exige um bot conectado. A página de rastreamento permanece a fonte do status atual se o Telegram estiver indisponível ou o bot estiver bloqueado.",
            "A moderação recebe alertas separados. Somente usuários na lista de permissão de moderadores do servidor podem limpar uma etapa pelo Telegram; um botão antigo não pode aplicar uma decisão repetida. Os motivos de recusa são editados no espaço de trabalho da moderação."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Configurações de notificação",
              "href": "/docs/notifications"
            }
          ]
        },
        {
          "id": "api",
          "title": "Contrato de solicitação e decisão",
          "paragraphs": [
            "A propriedade vem da sessão. Os candidatos não podem enviar userId, status, papéis ou resultados de revisão. Repetir a criação com o mesmo Idempotency-Key e corpo retorna a solicitação existente; alterar o corpo com essa chave produz um conflito.",
            "Uma decisão de moderador se aplica apenas à versão esperada da solicitação. Decisões simultâneas são salvas uma vez; a outra solicitação recebe 409. Um motivo de recusa é texto simples de 10–1500 caracteres. As evidências internas de revisão são restritas aos moderadores."
          ],
          "bullets": [],
          "steps": [],
          "table": {
            "headers": [
              "Rota",
              "Acesso e comportamento"
            ],
            "rows": [
              [
                "POST /api/applications",
                "Sessão + CSRF + Idempotency-Key; 202 com um URL privado"
              ],
              [
                "GET /api/applications",
                "Solicitações da conta atual"
              ],
              [
                "GET /api/applications/{id}",
                "Envio de propriedade, etapas e histórico público"
              ],
              [
                "POST /api/applications/{id}/resume",
                "Sessão + CSRF; continua processando apenas solicitações"
              ],
              [
                "GET /api/moderation/applications",
                "Somente moderadores verificados"
              ],
              [
                "POST /api/moderation/applications/{id}/decision",
                "approve_step ou reject, expectedVersion e um motivo de recusa"
              ]
            ]
          },
          "code": null,
          "note": "",
          "links": []
        },
        {
          "id": "outcome",
          "title": "Após a decisão",
          "paragraphs": [
            "Um novo pagamento e uma intenção de cartão exigem que a solicitação mais recente de revisão do site do comerciante seja aprovada. A aprovação por si só não conecta o gateway de pagamento. Se a revisão mudar após o envio, a operação existente permanece disponível para leitura de status, conciliação e um código bancário solicitado.",
            "Se rejeitado, o comerciante vê o motivo e pode corrigir os materiais antes de se candidatar novamente. Uma etapa amarela significa que um especialista ainda precisa decidir; não é aprovação automática."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": [
            {
              "label": "Suporte",
              "href": "/?support=open"
            },
            {
              "label": "Disponibilidade do gateway",
              "href": "/docs/gateway"
            }
          ]
        },
        {
          "id": "stores-usd",
          "title": "Múltiplas lojas e um preço base em USD",
          "paragraphs": [
            "Escolha Todas as lojas para análises e operações agregadas, ou selecione uma loja para seus próprios registros. Cada loja tem um storeId separado, nome, padrão de IVA, faturas, chaves de API, endpoints de webhook, histórico de eventos e aplicativo de site. Notificações e tickets de suporte pertencem à conta. Uma conta pode criar até 100 lojas. Registros existentes permanecem na primeira loja.",
            "As faturas do novo workspace usam pricingMode=\"universal\" e um preço base em USD. O plano Any inclui cartão, alipay, sbp e cripto; um comerciante pode selecionar um subconjunto. Cartões e Alipay cobram em USD. O SBP cobra em RUB usando a taxa de referência USD/RUB do Banco da Rússia. Cripto cobra USDT sob a regra explícita de fatura 1 USD = 1 USDT. Esta é uma regra de conversão de fatura, não uma cotação de mercado de USDT. O gateway fornece a taxa da moeda selecionada, o valor exato da transferência e instruções antes da transferência.",
            "A taxa de referência e ambos os valores são congelados na criação. Faturas que envolvem conversão RUB expiram dentro de 24 horas. Se a taxa de referência não puder ser obtida, a criação falha com FX_UNAVAILABLE; nenhuma taxa de fallback inventada ou desatualizada é usada. O valor do proprietário em minor e cotações usam a moeda contábil USD. quotes[method].settlement contém a cotação de cobrança nativa. O checkout público expõe a moeda de cobrança selecionada em currency, o preço original em baseAmountMinor/baseCurrency, e a taxa de referência em fx. Uma vez que um pagamento foi enviado, seu método não pode ser alterado; uma fatura tem uma operação de gateway.",
            "Crie uma chave de API dentro da loja pretendida e envie Authorization: Bearer <key> do seu servidor. Seu vínculo de loja é imutável; X-Kevmi-Store não pode conceder acesso a outra loja. Sessões de navegador selecionam X-Kevmi-Store: <storeId>; omitir seleciona a primeira loja. O valor all é aceito apenas por GET /api/account/dashboard e GET /api/payment-links. Mutações exigem uma loja selecionada, Origin e X-CSRF-Token. IDs de conta e IDs de loja são identificadores diferentes.",
            "Para compatibilidade, solicitações de API sem pricingMode=\"universal\" mantêm preço nativo e as restrições originais de moeda. Faturas existentes nunca são recalculadas. Recibos confirmados nas análises refletem pagamentos verificados menos despesas de fatura salvas; eles não são um saldo sacável. Moedas de fatura legadas permanecem separadas e pagamentos são combinados com o suporte. Cumpra um pedido somente após verificar payment.fulfillmentReady=true e payment.status=\"succeeded\" através da API do servidor, histórico de eventos ou um webhook assinado."
          ],
          "bullets": [],
          "steps": [],
          "table": null,
          "code": null,
          "note": "",
          "links": []
        }
      ],
      "group": "start",
      "url": "/docs/applications",
      "body": "Envie uma candidatura\n\nAs descrições exigem 40–3000 caracteres; os nomes de projeto permitem até 100. O site deve ser acessível sem fazer login. URLs contendo credenciais, hosts privados, portas não padrão ou parâmetros de consulta não são aceitas.\n\nA conta verificada é a proprietária da candidatura. O contato Telegram informado é para comunicação e não muda a propriedade. Encaminhar a URL de rastreamento não concede acesso a outra conta.\n\nEntre ou registre-se com Telegram e depois abra /account#applications.\n\nInforme um endereço de site HTTPS público, nome do projeto, categoria e uma descrição dos seus produtos ou serviços.\n\nAdicione um contato Telegram. Explique o que os clientes recebem e como os pedidos são atendidos.\n\nConfirme sua autoridade para enviar o site e envie o formulário.\n\nGuarde o endereço /account#applications/{id} que abre imediatamente após o envio.\n\nEnvie seu site\n\nQuatro etapas de revisão\n\nA linha de conexão e os marcadores de etapa refletem estados persistidos no servidor. Reabrir a página continua o mesmo processo. Fechar a aba não cancela sua candidatura; trabalhos em segundo plano continuam funcionando e recuperam etapas interrompidas.\n\nEtapa · O que acontece · Status exibido\nCandidatura recebida · Os detalhes do envio e o URL privado são salvos · A primeira etapa está concluída\nRevisão de conteúdo · A IA compara a descrição com o conteúdo do site público · Em execução, concluída ou aguardando um especialista\nVerificações técnicas · Disponibilidade e um conjunto limitado de links são examinados · Um resultado separado e o carimbo de data/hora da etapa\nRevisão do especialista · Um moderador revisa o envio e os achados · Aguardando decisão, aprovada ou um motivo de recusa\n\nUma etapa amarela precisa de um especialista\n\nUm marcador amarelo significa que uma etapa precisa de atenção, por exemplo porque as informações são insuficientes, um link está indisponível ou um resultado automatizado não pode ser aceito com confiança. Não é uma rejeição final. A página de status explica o próximo passo.\n\nUm moderador pode limpar a etapa atual para que a próxima verificação continue. Uma etapa recusada exibe uma cruz e um motivo visível ao usuário que o moderador pode editar antes de enviar. Limpar uma etapa intermediária nunca remove a revisão manual final.\n\nO que as verificações automatizadas cobrem\n\nAs verificações examinam a página inicial pública: HTTPS, resposta HTTP, título, texto e padrões suspeitos de links. Elas também solicitam cabeçalhos de no máximo três links no mesmo site. A contagem de redirecionamentos, o tamanho da resposta e o tempo de solicitação são limitados.\n\nAs verificações não acessam áreas autenticadas, não executam arquivos baixados nem substituem uma auditoria de segurança ou um scanner de malware. Concluir uma etapa não garante que toda página esteja livre de conteúdo malicioso.\n\nO conteúdo do site são dados não confiáveis. Instruções em um site não podem designar um administrador, alterar os termos da Kevmi nem aprovar uma solicitação. IA indisponível e saída de modelo malformada exigem revisão do especialista em vez de passar pela etapa silenciosamente.\n\nAtualizações do Telegram\n\nReceber uma solicitação, concluir uma etapa, solicitar atenção do especialista e tomar uma decisão final criam notificações com um link de rastreamento privado. Elas usam a categoria Suporte nas configurações de notificação da conta. Desativar essa categoria interrompe as mensagens.\n\nO evento da solicitação e a entrada da caixa de saída de notificações são confirmados juntos. A entrega via Telegram usa uma fila de tentativas e exige um bot conectado. A página de rastreamento permanece a fonte do status atual se o Telegram estiver indisponível ou o bot estiver bloqueado.\n\nA moderação recebe alertas separados. Somente usuários na lista de permissão de moderadores do servidor podem limpar uma etapa pelo Telegram; um botão antigo não pode aplicar uma decisão repetida. Os motivos de recusa são editados no espaço de trabalho da moderação.\n\nConfigurações de notificação\n\nContrato de solicitação e decisão\n\nA propriedade vem da sessão. Os candidatos não podem enviar userId, status, papéis ou resultados de revisão. Repetir a criação com o mesmo Idempotency-Key e corpo retorna a solicitação existente; alterar o corpo com essa chave produz um conflito.\n\nUma decisão de moderador se aplica apenas à versão esperada da solicitação. Decisões simultâneas são salvas uma vez; a outra solicitação recebe 409. Um motivo de recusa é texto simples de 10–1500 caracteres. As evidências internas de revisão são restritas aos moderadores.\n\nRota · Acesso e comportamento\nPOST /api/applications · Sessão + CSRF + Idempotency-Key; 202 com um URL privado\nGET /api/applications · Solicitações da conta atual\nGET /api/applications/{id} · Envio de propriedade, etapas e histórico público\nPOST /api/applications/{id}/resume · Sessão + CSRF; continua processando apenas solicitações\nGET /api/moderation/applications · Somente moderadores verificados\nPOST /api/moderation/applications/{id}/decision · approve_step ou reject, expectedVersion e um motivo de recusa\n\nApós a decisão\n\nUm novo pagamento e uma intenção de cartão exigem que a solicitação mais recente de revisão do site do comerciante seja aprovada. A aprovação por si só não conecta o gateway de pagamento. Se a revisão mudar após o envio, a operação existente permanece disponível para leitura de status, conciliação e um código bancário solicitado.\n\nSe rejeitado, o comerciante vê o motivo e pode corrigir os materiais antes de se candidatar novamente. Uma etapa amarela significa que um especialista ainda precisa decidir; não é aprovação automática.\n\nSuporte\n\nDisponibilidade do gateway\n\nMúltiplas lojas e um preço base em USD\n\nEscolha Todas as lojas para análises e operações agregadas, ou selecione uma loja para seus próprios registros. Cada loja tem um storeId separado, nome, padrão de IVA, faturas, chaves de API, endpoints de webhook, histórico de eventos e aplicativo de site. Notificações e tickets de suporte pertencem à conta. Uma conta pode criar até 100 lojas. Registros existentes permanecem na primeira loja.\n\nAs faturas do novo workspace usam pricingMode=\"universal\" e um preço base em USD. O plano Any inclui cartão, alipay, sbp e cripto; um comerciante pode selecionar um subconjunto. Cartões e Alipay cobram em USD. O SBP cobra em RUB usando a taxa de referência USD/RUB do Banco da Rússia. Cripto cobra USDT sob a regra explícita de fatura 1 USD = 1 USDT. Esta é uma regra de conversão de fatura, não uma cotação de mercado de USDT. O gateway fornece a taxa da moeda selecionada, o valor exato da transferência e instruções antes da transferência.\n\nA taxa de referência e ambos os valores são congelados na criação. Faturas que envolvem conversão RUB expiram dentro de 24 horas. Se a taxa de referência não puder ser obtida, a criação falha com FX_UNAVAILABLE; nenhuma taxa de fallback inventada ou desatualizada é usada. O valor do proprietário em minor e cotações usam a moeda contábil USD. quotes[method].settlement contém a cotação de cobrança nativa. O checkout público expõe a moeda de cobrança selecionada em currency, o preço original em baseAmountMinor/baseCurrency, e a taxa de referência em fx. Uma vez que um pagamento foi enviado, seu método não pode ser alterado; uma fatura tem uma operação de gateway.\n\nCrie uma chave de API dentro da loja pretendida e envie Authorization: Bearer <key> do seu servidor. Seu vínculo de loja é imutável; X-Kevmi-Store não pode conceder acesso a outra loja. Sessões de navegador selecionam X-Kevmi-Store: <storeId>; omitir seleciona a primeira loja. O valor all é aceito apenas por GET /api/account/dashboard e GET /api/payment-links. Mutações exigem uma loja selecionada, Origin e X-CSRF-Token. IDs de conta e IDs de loja são identificadores diferentes.\n\nPara compatibilidade, solicitações de API sem pricingMode=\"universal\" mantêm preço nativo e as restrições originais de moeda. Faturas existentes nunca são recalculadas. Recibos confirmados nas análises refletem pagamentos verificados menos despesas de fatura salvas; eles não são um saldo sacável. Moedas de fatura legadas permanecem separadas e pagamentos são combinados com o suporte. Cumpra um pedido somente após verificar payment.fulfillmentReady=true e payment.status=\"succeeded\" através da API do servidor, histórico de eventos ou um webhook assinado.",
      "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,
      "requestImplemented": true,
      "requestPath": "/api/account/payout-requests",
      "scheduledMethods": [
        "card",
        "alipay"
      ],
      "scheduledDays": [
        1,
        15
      ],
      "timeZone": "Asia/Qyzylorda",
      "requestAnyDay": true,
      "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_four_methods_in_universal_pricing",
      "allowedMethodsByCurrency": {
        "USD": [
          "card",
          "alipay",
          "sbp",
          "crypto"
        ],
        "RUB": [
          "card",
          "alipay",
          "sbp",
          "crypto"
        ],
        "USDT": [
          "card",
          "alipay",
          "sbp",
          "crypto"
        ]
      },
      "nativeAllowedMethodsByCurrency": {
        "USD": [
          "card",
          "alipay"
        ],
        "RUB": [
          "sbp"
        ],
        "USDT": [
          "crypto"
        ]
      },
      "apiCreateField": "methods",
      "legacyUsdCryptoApiSaveAccepted": true,
      "legacyUsdCryptoExecutable": false,
      "nativeCryptoRequiresExplicitUsdt": true,
      "ownerGetPaymentField": "payment",
      "ownerGetPaymentNullable": true,
      "createAndPatchPaymentSummaryOptional": true,
      "apiAnyValueSupported": false,
      "quotesPerMethod": true,
      "automaticCurrencyConversion": true,
      "conversionMode": "frozen_universal_quotes"
    },
    "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": "Ilhas Aland",
            "nameEn": "Åland Islands",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "AL",
            "name": "Albânia",
            "nameEn": "Albania",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "DZ",
            "name": "Argélia",
            "nameEn": "Algeria",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "AS",
            "name": "Samoa Americana",
            "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": "Anguila",
            "nameEn": "Anguilla",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "AG",
            "name": "Antígua e Barbuda",
            "nameEn": "Antigua & Barbuda",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "AR",
            "name": "Argentina",
            "nameEn": "Argentina",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "AM",
            "name": "Armênia",
            "nameEn": "Armenia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "AW",
            "name": "Aruba",
            "nameEn": "Aruba",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "AU",
            "name": "Austrália",
            "nameEn": "Australia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "AT",
            "name": "Áustria",
            "nameEn": "Austria",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "AZ",
            "name": "Azerbaijão",
            "nameEn": "Azerbaijan",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "BS",
            "name": "Bahamas",
            "nameEn": "Bahamas",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "BH",
            "name": "Barein",
            "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": "Bélgica",
            "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": "Bermudas",
            "nameEn": "Bermuda",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "BT",
            "name": "Butão",
            "nameEn": "Bhutan",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "BO",
            "name": "Bolívia",
            "nameEn": "Bolivia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "BQ",
            "name": "Países Baixos Caribenhos",
            "nameEn": "Caribbean Netherlands",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "BA",
            "name": "Bósnia e Herzegovina",
            "nameEn": "Bosnia & Herzegovina",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "BW",
            "name": "Botsuana",
            "nameEn": "Botswana",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "BV",
            "name": "Ilha Bouvet",
            "nameEn": "Bouvet Island",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "BR",
            "name": "Brasil",
            "nameEn": "Brazil",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "IO",
            "name": "Território Britânico do Oceano Índico",
            "nameEn": "British Indian Ocean Territory",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "BN",
            "name": "Brunei",
            "nameEn": "Brunei",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "BG",
            "name": "Bulgária",
            "nameEn": "Bulgaria",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "BF",
            "name": "Burquina Faso",
            "nameEn": "Burkina Faso",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "CV",
            "name": "Cabo Verde",
            "nameEn": "Cape Verde",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "KH",
            "name": "Camboja",
            "nameEn": "Cambodia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "CM",
            "name": "Camarões",
            "nameEn": "Cameroon",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "CA",
            "name": "Canadá",
            "nameEn": "Canada",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "KY",
            "name": "Ilhas Cayman",
            "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": "Ilha Christmas",
            "nameEn": "Christmas Island",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "CC",
            "name": "Ilhas Cocos (Keeling)",
            "nameEn": "Cocos (Keeling) Islands",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "CO",
            "name": "Colômbia",
            "nameEn": "Colombia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "KM",
            "name": "Comores",
            "nameEn": "Comoros",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "CK",
            "name": "Ilhas Cook",
            "nameEn": "Cook Islands",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "CR",
            "name": "Costa Rica",
            "nameEn": "Costa Rica",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "HR",
            "name": "Croácia",
            "nameEn": "Croatia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "CW",
            "name": "Curaçao",
            "nameEn": "Curaçao",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "CY",
            "name": "Chipre",
            "nameEn": "Cyprus",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "CZ",
            "name": "Tchéquia",
            "nameEn": "Czechia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "CI",
            "name": "Costa do Marfim",
            "nameEn": "Côte d’Ivoire",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "DK",
            "name": "Dinamarca",
            "nameEn": "Denmark",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "DJ",
            "name": "Djibuti",
            "nameEn": "Djibouti",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "DM",
            "name": "Dominica",
            "nameEn": "Dominica",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "DO",
            "name": "República Dominicana",
            "nameEn": "Dominican Republic",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "EC",
            "name": "Equador",
            "nameEn": "Ecuador",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "EG",
            "name": "Egito",
            "nameEn": "Egypt",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "SV",
            "name": "El Salvador",
            "nameEn": "El Salvador",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "GQ",
            "name": "Guiné Equatorial",
            "nameEn": "Equatorial Guinea",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "EE",
            "name": "Estônia",
            "nameEn": "Estonia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "SZ",
            "name": "Essuatíni",
            "nameEn": "Eswatini",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "ET",
            "name": "Etiópia",
            "nameEn": "Ethiopia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "FK",
            "name": "Ilhas Malvinas",
            "nameEn": "Falkland Islands",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "FO",
            "name": "Ilhas Faroé",
            "nameEn": "Faroe Islands",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "FM",
            "name": "Micronésia",
            "nameEn": "Micronesia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "FJ",
            "name": "Fiji",
            "nameEn": "Fiji",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "FI",
            "name": "Finlândia",
            "nameEn": "Finland",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "FR",
            "name": "França",
            "nameEn": "France",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "GF",
            "name": "Guiana Francesa",
            "nameEn": "French Guiana",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "PF",
            "name": "Polinésia Francesa",
            "nameEn": "French Polynesia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "TF",
            "name": "Territórios Franceses do Sul",
            "nameEn": "French Southern Territories",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "GA",
            "name": "Gabão",
            "nameEn": "Gabon",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "GM",
            "name": "Gâmbia",
            "nameEn": "Gambia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "GE",
            "name": "Geórgia",
            "nameEn": "Georgia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "DE",
            "name": "Alemanha",
            "nameEn": "Germany",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "GH",
            "name": "Gana",
            "nameEn": "Ghana",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "GI",
            "name": "Gibraltar",
            "nameEn": "Gibraltar",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "GR",
            "name": "Grécia",
            "nameEn": "Greece",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "GL",
            "name": "Groenlândia",
            "nameEn": "Greenland",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "GD",
            "name": "Granada",
            "nameEn": "Grenada",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "GP",
            "name": "Guadalupe",
            "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": "Guiné",
            "nameEn": "Guinea",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "GW",
            "name": "Guiné-Bissau",
            "nameEn": "Guinea-Bissau",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "GY",
            "name": "Guiana",
            "nameEn": "Guyana",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "HM",
            "name": "Ilhas Heard e McDonald",
            "nameEn": "Heard & McDonald Islands",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "VA",
            "name": "Cidade do Vaticano",
            "nameEn": "Vatican City",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "HN",
            "name": "Honduras",
            "nameEn": "Honduras",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "HK",
            "name": "Hong Kong, RAE da China",
            "nameEn": "Hong Kong SAR China",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "HU",
            "name": "Hungria",
            "nameEn": "Hungary",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "IS",
            "name": "Islândia",
            "nameEn": "Iceland",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "IN",
            "name": "Índia",
            "nameEn": "India",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "ID",
            "name": "Indonésia",
            "nameEn": "Indonesia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "IE",
            "name": "Irlanda",
            "nameEn": "Ireland",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "IM",
            "name": "Ilha de Man",
            "nameEn": "Isle of Man",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "IL",
            "name": "Israel",
            "nameEn": "Israel",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "IT",
            "name": "Itália",
            "nameEn": "Italy",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "JM",
            "name": "Jamaica",
            "nameEn": "Jamaica",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "JP",
            "name": "Japão",
            "nameEn": "Japan",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "JE",
            "name": "Jersey",
            "nameEn": "Jersey",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "JO",
            "name": "Jordânia",
            "nameEn": "Jordan",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "KZ",
            "name": "Cazaquistão",
            "nameEn": "Kazakhstan",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "KE",
            "name": "Quênia",
            "nameEn": "Kenya",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "KI",
            "name": "Quiribati",
            "nameEn": "Kiribati",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "KW",
            "name": "Kuwait",
            "nameEn": "Kuwait",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "KG",
            "name": "Quirguistão",
            "nameEn": "Kyrgyzstan",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "LA",
            "name": "Laos",
            "nameEn": "Laos",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "LV",
            "name": "Letônia",
            "nameEn": "Latvia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "LB",
            "name": "Líbano",
            "nameEn": "Lebanon",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "LS",
            "name": "Lesoto",
            "nameEn": "Lesotho",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "LR",
            "name": "Libéria",
            "nameEn": "Liberia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "LI",
            "name": "Liechtenstein",
            "nameEn": "Liechtenstein",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "LT",
            "name": "Lituânia",
            "nameEn": "Lithuania",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "LU",
            "name": "Luxemburgo",
            "nameEn": "Luxembourg",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "MO",
            "name": "Macau, RAE da China",
            "nameEn": "Macao SAR China",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "MG",
            "name": "Madagascar",
            "nameEn": "Madagascar",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "MW",
            "name": "Malaui",
            "nameEn": "Malawi",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "MY",
            "name": "Malásia",
            "nameEn": "Malaysia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "MV",
            "name": "Maldivas",
            "nameEn": "Maldives",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "MT",
            "name": "Malta",
            "nameEn": "Malta",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "MH",
            "name": "Ilhas Marshall",
            "nameEn": "Marshall Islands",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "MQ",
            "name": "Martinica",
            "nameEn": "Martinique",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "MR",
            "name": "Mauritânia",
            "nameEn": "Mauritania",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "MU",
            "name": "Maurício",
            "nameEn": "Mauritius",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "YT",
            "name": "Mayotte",
            "nameEn": "Mayotte",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "MX",
            "name": "México",
            "nameEn": "Mexico",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "MD",
            "name": "Moldávia",
            "nameEn": "Moldova",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "MC",
            "name": "Mônaco",
            "nameEn": "Monaco",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "MN",
            "name": "Mongólia",
            "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": "Marrocos",
            "nameEn": "Morocco",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "MZ",
            "name": "Moçambique",
            "nameEn": "Mozambique",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "NA",
            "name": "Namíbia",
            "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": "Países Baixos",
            "nameEn": "Netherlands",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "NC",
            "name": "Nova Caledônia",
            "nameEn": "New Caledonia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "NZ",
            "name": "Nova Zelândia",
            "nameEn": "New Zealand",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "NE",
            "name": "Níger",
            "nameEn": "Niger",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "NG",
            "name": "Nigéria",
            "nameEn": "Nigeria",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "NU",
            "name": "Niue",
            "nameEn": "Niue",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "NF",
            "name": "Ilha Norfolk",
            "nameEn": "Norfolk Island",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "MK",
            "name": "Macedônia do Norte",
            "nameEn": "North Macedonia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "MP",
            "name": "Ilhas Marianas do Norte",
            "nameEn": "Northern Mariana Islands",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "NO",
            "name": "Noruega",
            "nameEn": "Norway",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "OM",
            "name": "Omã",
            "nameEn": "Oman",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "PK",
            "name": "Paquistão",
            "nameEn": "Pakistan",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "PW",
            "name": "Palau",
            "nameEn": "Palau",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "PA",
            "name": "Panamá",
            "nameEn": "Panama",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "PG",
            "name": "Papua-Nova Guiné",
            "nameEn": "Papua New Guinea",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "PY",
            "name": "Paraguai",
            "nameEn": "Paraguay",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "PE",
            "name": "Peru",
            "nameEn": "Peru",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "PH",
            "name": "Filipinas",
            "nameEn": "Philippines",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "PN",
            "name": "Ilhas Pitcairn",
            "nameEn": "Pitcairn Islands",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "PL",
            "name": "Polônia",
            "nameEn": "Poland",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "PT",
            "name": "Portugal",
            "nameEn": "Portugal",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "PR",
            "name": "Porto Rico",
            "nameEn": "Puerto Rico",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "QA",
            "name": "Catar",
            "nameEn": "Qatar",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "RO",
            "name": "Romênia",
            "nameEn": "Romania",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "RW",
            "name": "Ruanda",
            "nameEn": "Rwanda",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "RE",
            "name": "Reunião",
            "nameEn": "Réunion",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "BL",
            "name": "São Bartolomeu",
            "nameEn": "St. Barthélemy",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "SH",
            "name": "Santa Helena",
            "nameEn": "St. Helena",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "KN",
            "name": "São Cristóvão e Névis",
            "nameEn": "St. Kitts & Nevis",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "LC",
            "name": "Santa Lúcia",
            "nameEn": "St. Lucia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "MF",
            "name": "São Martinho",
            "nameEn": "St. Martin",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "PM",
            "name": "São Pedro e Miquelão",
            "nameEn": "St. Pierre & Miquelon",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "VC",
            "name": "São Vicente e Granadinas",
            "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é e Príncipe",
            "nameEn": "São Tomé & Príncipe",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "SA",
            "name": "Arábia Saudita",
            "nameEn": "Saudi Arabia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "SN",
            "name": "Senegal",
            "nameEn": "Senegal",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "RS",
            "name": "Sérvia",
            "nameEn": "Serbia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "SC",
            "name": "Seicheles",
            "nameEn": "Seychelles",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "SL",
            "name": "Serra Leoa",
            "nameEn": "Sierra Leone",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "SG",
            "name": "Singapura",
            "nameEn": "Singapore",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "SX",
            "name": "Sint Maarten",
            "nameEn": "Sint Maarten",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "SK",
            "name": "Eslováquia",
            "nameEn": "Slovakia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "SI",
            "name": "Eslovênia",
            "nameEn": "Slovenia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "SB",
            "name": "Ilhas Salomão",
            "nameEn": "Solomon Islands",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "ZA",
            "name": "África do Sul",
            "nameEn": "South Africa",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "GS",
            "name": "Ilhas Geórgia do Sul e Sandwich do Sul",
            "nameEn": "South Georgia & South Sandwich Islands",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "KR",
            "name": "Coreia do Sul",
            "nameEn": "South Korea",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "ES",
            "name": "Espanha",
            "nameEn": "Spain",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "LK",
            "name": "Sri Lanka",
            "nameEn": "Sri Lanka",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "PS",
            "name": "Territórios palestinos",
            "nameEn": "Palestinian Territories",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "SR",
            "name": "Suriname",
            "nameEn": "Suriname",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "SJ",
            "name": "Svalbard e Jan Mayen",
            "nameEn": "Svalbard & Jan Mayen",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "SE",
            "name": "Suécia",
            "nameEn": "Sweden",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "CH",
            "name": "Suíça",
            "nameEn": "Switzerland",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "TW",
            "name": "Taiwan",
            "nameEn": "Taiwan",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "TJ",
            "name": "Tadjiquistão",
            "nameEn": "Tajikistan",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "TZ",
            "name": "Tanzânia",
            "nameEn": "Tanzania",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "TH",
            "name": "Tailândia",
            "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 e Tobago",
            "nameEn": "Trinidad & Tobago",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "TN",
            "name": "Tunísia",
            "nameEn": "Tunisia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "TM",
            "name": "Turcomenistão",
            "nameEn": "Turkmenistan",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "TC",
            "name": "Ilhas Turcas e Caicos",
            "nameEn": "Turks & Caicos Islands",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "TV",
            "name": "Tuvalu",
            "nameEn": "Tuvalu",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "TR",
            "name": "Turquia",
            "nameEn": "Türkiye",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "UG",
            "name": "Uganda",
            "nameEn": "Uganda",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "UA",
            "name": "Ucrânia",
            "nameEn": "Ukraine",
            "marker": "**",
            "coverage": "partial_locations",
            "note": "Os cartões não estão disponíveis na Crimeia, Donetsk, Luhansk, Kherson e Zaporizhzhia. O restante da Ucrânia está disponível."
          },
          {
            "code": "AE",
            "name": "Emirados Árabes Unidos",
            "nameEn": "United Arab Emirates",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "GB",
            "name": "Reino Unido",
            "nameEn": "United Kingdom",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "UM",
            "name": "Ilhas Menores Distantes dos EUA",
            "nameEn": "U.S. Outlying Islands",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "US",
            "name": "Estados Unidos",
            "nameEn": "United States",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "UY",
            "name": "Uruguai",
            "nameEn": "Uruguay",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "UZ",
            "name": "Uzbequistão",
            "nameEn": "Uzbekistan",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "VU",
            "name": "Vanuatu",
            "nameEn": "Vanuatu",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "VN",
            "name": "Vietnã",
            "nameEn": "Vietnam",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "VG",
            "name": "Ilhas Virgens Britânicas",
            "nameEn": "British Virgin Islands",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "VI",
            "name": "Ilhas Virgens Americanas",
            "nameEn": "U.S. Virgin Islands",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "WF",
            "name": "Wallis e Futuna",
            "nameEn": "Wallis & Futuna",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "EH",
            "name": "Saara Ocidental",
            "nameEn": "Western Sahara",
            "marker": "",
            "coverage": "listed",
            "note": ""
          },
          {
            "code": "ZM",
            "name": "Zâmbia",
            "nameEn": "Zambia",
            "marker": "",
            "coverage": "listed",
            "note": ""
          }
        ],
        "source": "owner_provided",
        "status": "owner_list_received",
        "policy": "worldwide_except_restrictions",
        "independentlyVerified": false,
        "partialCoverage": {
          "marker": "**",
          "countryCodes": [
            "UA"
          ],
          "note": "Os cartões não estão disponíveis na Crimeia, Donetsk, Luhansk, Kherson e Zaporizhzhia. O restante da Ucrânia está disponível."
        },
        "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": true,
      "privateAccountConsentRequired": true,
      "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": {
      "multipleStores": true,
      "storeLimit": 100,
      "storeEndpoint": "/api/stores",
      "storeHeader": "X-Kevmi-Store",
      "aggregateReadOnly": true,
      "pricingMode": "universal",
      "baseCurrency": "USD",
      "sbpChargeCurrency": "RUB",
      "cryptoChargeCurrency": "USDT",
      "usdUsdtInvoiceRatio": "1:1",
      "referenceRateSource": "https://www.cbr.ru/scripts/XML_daily.asp",
      "fxInvoiceMaxHours": 24,
      "path": "/account",
      "sections": [
        "overview",
        "payments",
        "payouts",
        "pricing",
        "stores",
        "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": "pt",
  "docGroups": [
    {
      "id": "start",
      "title": "Começando",
      "description": "Da sua primeira visita a uma loja configurada.",
      "icon": "bolt"
    },
    {
      "id": "payments",
      "title": "Pagamentos e termos",
      "description": "Links, valores, IVA, métodos de pagamento e pagamentos.",
      "icon": "card"
    },
    {
      "id": "account",
      "title": "Conta e suporte",
      "description": "Telegram, notificações e ajuda com sua pergunta.",
      "icon": "settings"
    },
    {
      "id": "developers",
      "title": "Desenvolvedores",
      "description": "API, segurança, webhooks e integração de gateway.",
      "icon": "book"
    }
  ],
  "navPages": [
    {
      "href": "/",
      "title": "Visão geral",
      "icon": "grid"
    },
    {
      "href": "/payment-methods",
      "title": "Métodos de pagamento",
      "icon": "card"
    },
    {
      "href": "/pricing",
      "title": "Preços",
      "icon": "percent"
    },
    {
      "href": "/payment-links",
      "title": "Links de pagamento",
      "icon": "link"
    },
    {
      "href": "/countries",
      "title": "Cobertura",
      "icon": "globe"
    },
    {
      "href": "/docs",
      "title": "Documentação",
      "icon": "book"
    },
    {
      "href": "/?support=open",
      "title": "Suporte",
      "icon": "chat"
    },
    {
      "href": "/integrations",
      "title": "Integrações",
      "icon": "code"
    }
  ],
  "paymentMethods": [
    {
      "id": "card",
      "name": "Cartões internacionais",
      "shortName": "Cartões internacionais",
      "description": "Pagamentos com cartão para clientes internacionais.",
      "incomingPercent": 10,
      "incomingFixedMinor": 50,
      "incomingFixedCurrency": "USD",
      "payoutPercent": 4,
      "payoutFixedMinor": 0,
      "payoutFixedCurrency": "USD",
      "vatApplies": true,
      "region": "Pagamentos internacionais",
      "symbol": "card",
      "geography": "Visa e Mastercard de mais de 190 países, exceto a lista de restrições e cinco regiões da Ucrânia.",
      "countryCount": 223,
      "ownerReportedCountryCount": null,
      "coverageLabel": "190+"
    },
    {
      "id": "sbp",
      "name": "SBP",
      "shortName": "SBP",
      "description": "Pague por meio de um banco com o Sistema de Pagamentos Rápidos da Rússia.",
      "incomingPercent": 8,
      "incomingFixedMinor": 0,
      "incomingFixedCurrency": "RUB",
      "payoutPercent": 5,
      "payoutFixedMinor": 40000,
      "payoutFixedCurrency": "RUB",
      "vatApplies": false,
      "region": "Rússia",
      "symbol": "sbp",
      "geography": "Rússia. A disponibilidade depende do banco e da transação.",
      "countryCount": 1
    },
    {
      "id": "alipay",
      "name": "Alipay",
      "shortName": "Alipay",
      "description": "Pagamentos Alipay para clientes na China.",
      "incomingPercent": 10,
      "incomingFixedMinor": 50,
      "incomingFixedCurrency": "USD",
      "payoutPercent": 4,
      "payoutFixedMinor": 0,
      "payoutFixedCurrency": "USD",
      "vatApplies": true,
      "region": "China",
      "symbol": "alipay",
      "geography": "China. A disponibilidade depende da conta e da transação.",
      "countryCount": 1
    },
    {
      "id": "crypto",
      "name": "Criptomoeda",
      "shortName": "Cripto",
      "description": "Pagamentos cripto únicos com taxa de 4% e sem IVA.",
      "incomingPercent": 4,
      "incomingFixedMinor": 0,
      "incomingFixedCurrency": "USD",
      "payoutPercent": 0,
      "payoutFixedMinor": 300,
      "payoutFixedCurrency": "USD",
      "vatApplies": false,
      "region": "Ativos digitais",
      "symbol": "crypto",
      "geography": "Todos os países do mundo. Escolha uma moeda e rede suportadas. Os pagamentos usam USDT TRC20.",
      "countryCount": null
    }
  ],
  "payoutFees": {
    "card": "4%",
    "alipay": "4%",
    "sbp": "5% + RUB 400",
    "crypto": "0% + $3"
  },
  "documentationLocale": "pt"
}
