API de pagamentos em cripto para desenvolvedores
Uma referência prática da API de pagamentos da Qvard: autenticação, criação de um pagamento, a URL de redirecionamento, estados, webhooks, disponibilidade do método e saques, com erros e o que ainda não existe.

A API da Qvard é deliberadamente pequena. Três rotas cobrem todo o ciclo: criar um pagamento, verificar se um método de pagamento está disponível e enviar um saque. Esta referência descreve cada uma como funciona hoje, com os erros que você vai encontrar, e é honesta sobre o que a API não tem, para que você não construa sobre um recurso que não existe.
O que a API cobre
A API pública fica em https://api.qvard.com/api/v1 e tem três rotas:
POST /payment: criar um pagamento e obter o endereço da página de pagamento hospedada.GET /method/:id/info: verificar se um método de pagamento do seu projeto está pronto para aceitar pagamentos.POST /payout: enviar um saque para um endereço cripto.
Os resultados chegam por webhook: a Qvard chama uma URL que você salvou no projeto quando um pagamento é concluído. Não há rota para ler um pagamento pelo id, então o webhook é como você descobre o resultado. Todo o resto, como o painel, os saldos e as configurações, é feito na interface web.
Autenticação
Cada requisição leva a chave de API do seu projeto no cabeçalho x-api-key. Não há tokens a renovar nem OAuth. Uma chave ausente ou desconhecida devolve 401 com a mensagem error.wrong.api.key.
Trate a chave como uma senha: mantenha-a no servidor, em uma variável de ambiente ou em um gerenciador de segredos, e nunca em código de front-end ou em um repositório público. Essa mesma chave é a que a Qvard devolve a você no cabeçalho x-api-key do webhook, então um vazamento afeta os dois sentidos.
Criar um pagamento
POST /api/v1/payment recebe um corpo JSON:
id(string, obrigatório): seu próprio identificador do pedido ou da fatura. Ele volta no webhook.price(número, obrigatório): o valor em dólares americanos. O cliente paga o equivalente no ativo e na rede que escolher.paymentSystemId(número, opcional): um método de pagamento do seu projeto. Se você o passar, a página de pagamento abre com esse ativo e essa rede selecionados.
A resposta é 201 com dois campos: id, o identificador do pagamento no lado da Qvard, e redirectUrl, o endereço da página de pagamento hospedada, no formato https://my.qvard.com/pay/<id>. Redirecione o cliente para lá, ou coloque o link em um e-mail.
A chamada é idempotente por id e método de pagamento: enviar o mesmo id de novo para o mesmo método devolve o pagamento existente em vez de criar um segundo, então é seguro repetir após um timeout. Note que o código de status é 201, não 200.
curl -X POST https://api.qvard.com/api/v1/payment \
-H "x-api-key: $QVARD_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "id": "order-1042", "price": 49.9 }'
# 201 Created
# { "id": "6f1c2d3e-...", "redirectUrl": "https://my.qvard.com/pay/6f1c2d3e-..." }
# 401 { "message": "error.wrong.api.key" }
# 400 { "message": "Error validation", "errors": { "price": "..." } }Erros
Os erros têm uma forma só, um corpo JSON com uma message:
400: o corpo falhou na validação. A mensagem éError validatione um objetoerrorsassocia cada campo ao seu primeiro problema, por exemplo umidausente ou umpriceque não é número. Um valor abaixo do mínimo do método escolhido é rejeitado da mesma forma.401: o cabeçalhox-api-keyestá ausente ou é desconhecido (error.wrong.api.key).404: na rota de informações do método, um id de método que não existe (error.notfound).
Registre o corpo completo da resposta ao receber um 4xx; a mensagem indica o campo a corrigir. Não repita um 400 ou 401 sem mudar algo, mas repita um timeout ou um 5xx, o que é seguro graças à idempotência acima.
Estados do pagamento e o webhook
Um pagamento tem um de quatro estados: wait (criado, não pago), partial (chegou menos que o valor total), completed (chegou o valor total) e rejected.
O webhook é enviado quando o pagamento está concluído: a Qvard faz um POST para a callback URL do seu projeto com um JSON pequeno contendo o seu id e o status, e coloca a sua chave de API no cabeçalho x-api-key. Seu endpoint deve responder exatamente HTTP 200; qualquer outro status, um timeout ou um redirecionamento conta como entrega falha e é repetido, cinco tentativas no total em cerca de seis minutos. O cabeçalho é de autenticação, não uma assinatura criptográfica, então compare-o com a sua chave em tempo constante. Torne o tratador idempotente, porque uma entrega pode chegar duas vezes.
Os detalhes, com código, estão em como proteger webhooks de pagamentos em cripto, e o fluxo inteiro é percorrido em como aceitar pagamentos em cripto em um site.
Verificar se um método está pronto
GET /api/v1/method/:id/info recebe o id numérico de um método de pagamento do seu projeto e responde 200 com três campos:
server: detalhes sobre o estado do método.isReady:truequando o método está pronto para aceitar um pagamento.isActive:truequando o método não está offline, mesmo que ainda esteja se atualizando com a rede.
Use antes de oferecer um ativo e uma rede específicos no seu checkout, por exemplo para ocultar um método temporariamente indisponível. Um id desconhecido devolve 404. É opcional: se você deixa o cliente escolher na página de pagamento, não precisa dele.
Saques
POST /api/v1/payout envia fundos do seu saldo para um endereço cripto. O corpo JSON tem:
id(string, obrigatório): seu próprio identificador do saque, usado para evitar duplicidade em novas tentativas, então enviar o mesmoidduas vezes não paga duas vezes.price(número, obrigatório): o valor na cripto do método, não em dólares.methodId(número, obrigatório): o método de pagamento do seu projeto.address(string, obrigatório): o endereço de destino.comment(string, opcional).
Uma chamada bem-sucedida devolve 201. Saques movimentam dinheiro de verdade, então teste com um valor pequeno, confira duas vezes o endereço e a rede do método e confirme com a Qvard que os saques pela API estão habilitados para o seu projeto. O saque para conta bancária em moeda fiduciária não está disponível; um saque vai para um endereço cripto e custa apenas a taxa de rede.
O que a API ainda não tem
Para poupar você de procurar:
- Nenhum endpoint para buscar um pagamento pelo id, então confie no webhook e nos seus próprios registros.
- Nenhuma assinatura do webhook; a autenticação é o cabeçalho
x-api-key. - Nenhum sandbox: um ambiente de testes separado está no roadmap, então use pequenos valores reais. Uma fatura de demonstração mostra a página de pagamento sem pagar.
- Nenhuma URL de retorno após o pagamento: o cliente volta ao seu site por conta própria.
- Nenhum plugin pronto para plataformas de loja, e os links de pagamento estão em desenvolvimento.
Para formatos e exemplos, veja a documentação para desenvolvedores. Para as condições comerciais, a página de preços.
FAQ
Em que moeda defino o preço?
Em dólares americanos. O cliente paga o equivalente no ativo e na rede que escolher na página de pagamento, a uma cotação fixa por uma hora. O saque é a exceção: seu valor é na cripto do método.
É seguro repetir a criação de um pagamento?
Sim. Enviar o mesmo id para o mesmo método de pagamento devolve o pagamento existente, então repetir após um timeout não cria duplicata.
Como descubro o resultado de um pagamento?
Pelo webhook, enviado quando o pagamento é concluído. Não há rota para ler um pagamento pelo id, então guarde o id que você envia e faça o casamento quando o webhook chegar.
Existe sandbox?
Ainda não. Um ambiente de testes separado está planejado. Por ora use pequenos valores reais e uma fatura de demonstração para ver a página de pagamento.