Documentação API NetVacinas

Para explorar de forma interativa a API acesse: https://docs.netvacinas.com.br/graphiql.html

Autenticação

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"

Requisição

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.

Exemplos

Os dados de exemplo abaixo são fictícios e não correspondem a dados reais de nenhuma clínica.

Consulta de vendas

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
    },
  }),
});
Retorno:
{
  "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"
                }
              }
            ]
          }
        ]
      }
    }
  }
}

Consulta de agendamentos com horário de um dia específico

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,
    },
  }),
});
Retorno:
{
  "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"
                }
              }
            ]
          }
        ]
      }
    }
  }
}

Consulta de aprazamentos / agendamentos sem horário de um dia #### Consulta de agendamentos com horário de um dia específico

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,
    },
  }),
});
Retorno:
{
  "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"
            }
          }
        ]
      }
    }
  }
}