Autenticação
A API pública do Vmix Pay usa OAuth2 client_credentials. Você troca suas
credenciais (client_id + client_secret) por um access_token Bearer de
curta duração e usa esse token nas chamadas de negócio — o client_secret nunca
acompanha as requisições.
Passo a passo
Seção intitulada “Passo a passo”-
Crie a credencial no painel.
Acesse
/painel/tokensno painel do Vmix Pay e gere uma credencial de API. Você recebe umclient_ide umclient_secret. -
Obtenha o
access_token.Faça
POST /v1/oauth/tokencom as credenciais no headerAuthorization: Basic base64(client_id:client_secret)e o corpogrant_type=client_credentials. O corpo pode serapplication/x-www-form-urlencodedouapplication/json.A resposta
200traz o token e seus metadados:{"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...","token_type": "Bearer","expires_in": 900,"scope": "charges:create charges:read"} -
Chame a API com o
Bearer.Use o
access_tokenno headerAuthorization: Bearer <access_token>em todas as chamadas de negócio (e o headerIdempotency-Keynas operações financeiras — veja Erros & Idempotência).
Obtendo o token
Seção intitulada “Obtendo o token”curl -X POST https://api.vmixpay.com.br/v1/oauth/token \ -u "SEU_CLIENT_ID:SEU_CLIENT_SECRET" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "grant_type=client_credentials"A flag
-udo curl monta o headerAuthorization: Basicautomaticamente.
const creds = Buffer.from( `${process.env.VMIX_CLIENT_ID}:${process.env.VMIX_CLIENT_SECRET}`,).toString("base64");
const res = await fetch("https://api.vmixpay.com.br/v1/oauth/token", { method: "POST", headers: { Authorization: `Basic ${creds}`, "Content-Type": "application/json", }, body: JSON.stringify({ grant_type: "client_credentials" }),});
const { access_token, expires_in } = await res.json();<?php$creds = base64_encode(getenv('VMIX_CLIENT_ID') . ':' . getenv('VMIX_CLIENT_SECRET'));
$ch = curl_init('https://api.vmixpay.com.br/v1/oauth/token');curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ 'Authorization: Basic ' . $creds, 'Content-Type: application/x-www-form-urlencoded', ], CURLOPT_POSTFIELDS => 'grant_type=client_credentials',]);
$token = json_decode(curl_exec($ch), true)['access_token'];import requests
res = requests.post( "https://api.vmixpay.com.br/v1/oauth/token", auth=("SEU_CLIENT_ID", "SEU_CLIENT_SECRET"), # Basic auth data={"grant_type": "client_credentials"},)access_token = res.json()["access_token"]Usando o token
Seção intitulada “Usando o token”curl https://api.vmixpay.com.br/v1/charges/<charge_id> \ -H "Authorization: Bearer SEU_ACCESS_TOKEN"Validade e renovação
Seção intitulada “Validade e renovação”O access_token é um JWT de curta duração — o campo expires_in é o TTL em
segundos (tipicamente ~900s / 15 minutos). Quando ele expirar, re-emita um
novo chamando POST /v1/oauth/token de novo. Uma estratégia comum é guardar o token
em cache e renová-lo um pouco antes de expires_in vencer.
Erros de autenticação
Seção intitulada “Erros de autenticação”O POST /v1/oauth/token segue o formato de erro da RFC 6749 §5.2 — diferente do
envelope de erro padrão do resto da API:
| HTTP | Corpo | Quando |
|---|---|---|
400 |
{ "error": "unsupported_grant_type" } |
grant_type ausente ou diferente de client_credentials. |
401 |
{ "error": "invalid_client" } |
Credenciais ausentes, malformadas ou inválidas. |
429 |
Envelope de erro padrão | Limite de tentativas excedido (proteção contra brute-force; 5/min por IP). |