Para explorar de forma interativa a API acesse: https://docs.netvacinas.com.br/graphiql.html
A autenticação na API é feita através de um token válido gerado, que pode ser obtido através do NetVacinas pelo menu Master -> Chave da API NetVacinas.
Para realizar a autenticação, é preciso enviar nos Headers da requisição a chave Authorization e o token com prefixo Bearer.
Authorization: "Bearer SEU_TOKEN"
A requisição sempre deve ser feita para a URL https://api.netvacinas.com.br/graphql utilizando o método HTTP POST.
Deve ser informado os cabeçalhos Authorization com o token da clínica para autenticação e Content-Type com valor application/json.
No corpo da requisição será enviado um JSON com duas chaves: query e variables. Na chave query é passado uma string com os campos que devem ser retornados pela API e na chave variables é passado um objeto com as variáveis (startDate, endDate, page e perPage) que serão utilizadas para filtrar e paginar os dados.
Note que a variável page não deverá ser passada na primeira requisição. Se houverem mais páginas (hasNextPage: true) o valor passado nas próximas requisições será o valor atributo nextPage para realizar a troca de página.
Os dados de exemplo abaixo são fictícios e não correspondem a dados reais de nenhuma clínica.
const tokenDaClinica = "...";
fetch("https://api.netvacinas.com.br/graphql", {
method: "POST",
headers: new Headers({
"Content-Type": "application/json",
Authorization: `Bearer ${tokenDaClinica}`,
}),
body: JSON.stringify({
query: `query($startDate: Date!, $endDate: Date!, $page: ID, $perPage: Int!) {
myClinic {
tradingName
companyName
cnpj
sales(startDate: $startDate, endDate: $endDate, take: $perPage, after: $page) {
# Informações de paginação
pagination {
# Informa se existem mais páginas nessa query
hasNextPage
#Utilize o valor retornado nesse campo no parametro "page" da próxima query
nextPage
}
# Total de vendas feita no período informado
count
# Total bruto faturado das vendas feitas no período informado
grossTotal: total(revenue: GROSS) {
value
currency
}
# Total líquido faturado das vendas feitas no período informado
netTotal: total(revenue: NET) {
value
currency
}
# Lista das vendas dessa página
records {
# ID único dessa venda
id
# Data e hora que a venda foi feita
saleDate
# Subtotal dessa venda (somatória do total de todos os itens)
subtotal {
value
currency
}
discount {
value
currency
}
fee {
value
currency
}
# Faturamento bruto dessa venda (subtotal + taxa da venda - desconto da venda)
grossTotal: total(revenue: GROSS) {
value
currency
}
# Faturamento liquido dessa venda
netTotal: total(revenue: NET) {
value
currency
}
# Os itens dessa venda.
# Uma única venda pode ter múltiplas aplicações de vacinas.
items {
price {
value
currency
}
discount {
value
currency
}
fee {
value
currency
}
# Valor faturado desse item da venda (preco + taxa - desconto)
saleItemTotal {
value
currency
}
# Caso o item seja uma aplicação de vacina...
...on VaccineShot {
# Se a vacina foi aplicada
applied: isVaccineShotStatus(status: APPLIED)
# Se a vacina está agendada e ainda não foi aplicada
scheduled: isVaccineShotStatus(status: SCHEDULED)
# Nome da vacina
vaccine {
name
}
# Nome do fabricante da vacina
manufacturer {
name
}
# Dados do paciente
patient {
name
cpf
email
phoneNumbers
address {
street
number
complement
city
state
zipCode
}
}
# Se é uma vacina domiciliar
isHomeApplication
}
# Caso o item seja uma vacina aplicada...
...on AppliedVaccineShot {
# Data que foi aplicada
appliedDate: date
# Código do lote que foi aplicado
batch {
code
}
}
# Caso o item seja uma vacina agendada...
...on ScheduledVaccineShot {
# Data que a vacina está agendada
scheduledDate: date
}
}
}
}
}
}`,
variables: {
startDate: "2019-04-01T00:00:00-03:00", // Formato ISO 8601 com timezone
endDate: "2019-04-30T23:59:59-03:00", // Formato ISO 8601 com timezone
perPage: 3, // Vendas por página
page: null, // A primeira chamada não é necessário informar a página
},
}),
});
{
"data": {
"myClinic": {
"tradingName": "Nome Fantasia",
"companyName": "Razão Social",
"cnpj": "00.000.000/0000-00",
"sales": {
"pagination": {
"hasNextPage": true,
"nextPage": "MQ=="
},
"count": 3345,
"grossTotal": {
"value": "836540.00",
"currency": "BRL"
},
"netTotal": {
"value": "809709.05",
"currency": "BRL"
},
"records": [
{
"id": "eyJjbGluaWNJZCI6MTQwLCJpZCI6OTI2MTcxLCJzYWxlVHlwZSI6IlNob3QiLCJ0eXBlIjoiU2FsZSJ9",
"exchanged": false,
"cancelled": false,
"saleDate": "2020-01-02T14:01:00.000Z",
"grossTotal": {
"value": "355.00",
"currency": "BRL"
},
"netTotal": {
"value": "331.85",
"currency": "BRL"
},
"items": [
{
"price": {
"value": "355.00",
"currency": "BRL"
},
"discount": {
"value": "0.00",
"currency": "BRL"
},
"fee": {
"value": "0.00",
"currency": "BRL"
},
"saleItemTotal": {
"value": "355.00",
"currency": "BRL"
},
"applied": true,
"scheduled": false,
"vaccine": {
"name": "Infanrix"
},
"manufacturer": {
"name": "GSK"
},
"patient": {
"name": "João Pedro"
},
"isHomeApplication": false,
"appliedDate": "2020-01-02",
"batch": {
"code": "A21CD345A"
}
}
]
},
{
"id": "eyJjbGluaWNJZCI6MTQwLCJpZCI6OTI2MTk1LCJzYWxlVHlwZSI6IlNob3QiLCJ0eXBlIjoiU2FsZSJ9",
"exchanged": false,
"cancelled": false,
"saleDate": "2020-01-02T14:21:00.000Z",
"grossTotal": {
"value": "340.00",
"currency": "BRL"
},
"netTotal": {
"value": "340.00",
"currency": "BRL"
},
"items": [
{
"price": {
"value": "355.00",
"currency": "BRL"
},
"discount": {
"value": "15.00",
"currency": "BRL"
},
"fee": {
"value": "0.00",
"currency": "BRL"
},
"saleItemTotal": {
"value": "340.00",
"currency": "BRL"
},
"applied": false,
"scheduled": true,
"vaccine": {
"name": "Infanrix"
},
"manufacturer": {
"name": "GSK"
},
"patient": {
"name": "Maria José"
},
"isHomeApplication": false,
"scheduledDate": "2020-03-05"
}
]
},
{
"id": "eyJjbGluaWNJZCI6MTQwLCJpZCI6OTI2MjAwLCJzYWxlVHlwZSI6IlNob3QiLCJ0eXBlIjoiU2FsZSJ9",
"exchanged": false,
"cancelled": false,
"saleDate": "2020-01-02T14:23:00.000Z",
"grossTotal": {
"value": "190.00",
"currency": "BRL"
},
"netTotal": {
"value": "186.98",
"currency": "BRL"
},
"items": [
{
"price": {
"value": "190.00",
"currency": "BRL"
},
"discount": {
"value": "0.00",
"currency": "BRL"
},
"fee": {
"value": "0.00",
"currency": "BRL"
},
"saleItemTotal": {
"value": "190.00",
"currency": "BRL"
},
"applied": true,
"scheduled": false,
"vaccine": {
"name": "Dtpa Refortrix"
},
"manufacturer": {
"name": "GSK"
},
"patient": {
"name": "João Maria"
},
"isHomeApplication": false,
"appliedDate": "2020-01-02",
"batch": {
"code": "AC39B123AI"
}
}
]
}
]
}
}
}
}
Definindo startDate e endDate iguais, apenas os agendamentos do dia serão retornados. Você também pode requisitar um período com startDate e endDate diferentes.
const tokenDaClinica = "...";
fetch("https://api.netvacinas.com.br/graphql", {
method: "POST",
headers: new Headers({
"Content-Type": "application/json",
Authorization: `Bearer ${tokenDaClinica}`,
}),
body: JSON.stringify({
query: `query($startDate: Date!, $endDate: Date!, $page: ID, $perPage: Int!) {
myClinic {
appointments(startDate: $startDate, endDate: $endDate, take: $perPage, after: $page) {
pagination {
hasNextPage
nextPage
}
records {
internalId
date
startTime
endTime
patients {
internalId
name
whatsappPhoneNumber
}
shots {
internalId
vaccine {
internalId
name
}
patient {
internalId
name
whatsappPhoneNumber
}
}
}
}
}
}
`,
variables: {
startDate: "2026-01-08T03:00:00.000Z", // O horário é desconsiderado, mas é necessário informar o timezone para que a data seja interpretada corretamente.
endDate: "2026-01-08T03:00:00.000Z", // O horário é desconsiderado, mas é necessário informar o timezone para que a data seja interpretada corretamente.
perPage: 100,
page: null,
},
}),
});
{
"data": {
"myClinic": {
"appointments": {
"pagination": {
"hasNextPage": false,
"nextPage": null
},
"records": [
{
"internalId": "369223",
"date": "2026-01-08T03:00:00.000Z",
"startTime": "10:30:00",
"endTime": "10:45:00",
"patients": [
{
"internalId": "1003208",
"name": "Gael Neves Parreira",
"whatsappPhoneNumber": "(96) 98520-1099"
}
],
"shots": [
{
"internalId": "7997893",
"vaccine": {
"internalId": "1579",
"name": "HEXAVALENTE (Infanrix)"
},
"patient": {
"internalId": "1003208",
"name": "Gael Neves Parreira",
"whatsappPhoneNumber": "(96) 98520-1099"
}
}
]
}
]
}
}
}
}
Os aprazamentos são as aplicações que foram agendadas mas não tiveram um horário do agendamento definido. Aparecem no topo da agenda.
Definindo startDate e endDate iguais, apenas os aprazamentos do dia serão retornados. Você também pode requisitar um período com startDate e endDate diferentes.
const tokenDaClinica = "...";
fetch("https://api.netvacinas.com.br/graphql", {
method: "POST",
headers: new Headers({
"Content-Type": "application/json",
Authorization: `Bearer ${tokenDaClinica}`,
}),
body: JSON.stringify({
query: `query($startDate: Date!, $endDate: Date!, $page: ID, $perPage: Int!) {
myClinic {
scheduledShots(startDate: $startDate, endDate: $endDate, take: $perPage, after: $page) {
pagination {
hasNextPage
nextPage
}
records {
internalId
date
patient {
internalId
name
whatsappPhoneNumber
}
vaccine {
internalId
name
}
}
}
}
}`,
variables: {
startDate: "2026-01-08T03:00:00.000Z", // O horário é desconsiderado, mas é necessário informar com horário no formato ISO para que a data seja interpretada corretamente.
endDate: "2026-01-08T03:00:00.000Z", // O horário é desconsiderado, mas é necessário informar com horário no formato ISO para que a data seja interpretada corretamente.
perPage: 100,
page: null,
},
}),
});
{
"data": {
"myClinic": {
"scheduledShots": {
"pagination": {
"hasNextPage": false,
"nextPage": null
},
"records": [
{
"internalId": "7907885",
"date": "2026-01-03",
"patient": {
"internalId": "956571",
"name": "Hugo Dias Novaes",
"whatsappPhoneNumber": "(19) 99310-8837"
},
"vaccine": {
"internalId": "23587",
"name": "Meningo B"
}
}
]
}
}
}
}