Ir para o conteúdo principal

Para desenvolvedores

API do estudante.id

Confirme em tempo real que a pessoa à sua frente é estudante de ensino superior verificada — a partir do código que ela mesma te mostra. Sem e-mail, sem CPF, sem documento para guardar.

Visão geral

O estudante se verifica uma vez no estudante.id, recebendo um link de acesso no e-mail institucional; o domínio é conferido no Cadastro e-MEC de instituições de ensino superior. A verificação vale por 12 meses.

Seu sistema envia o código do estudante e recebe: se está verificado, a instituição, a validade e se ele declarou ter 18 anos ou mais.

Quando usar — e quando não usar

✓ Use para

  • Preço para estudante, lote estudante e cupons universitários definidos por você
  • Conferir estudantes na portaria de eventos universitários
  • Um sinal a mais contra fraude em compras declaradas como estudante

✕ Não use para

  • Meia-entrada legal. A Lei 12.933/2013 exige a Carteira de Identificação Estudantil (CIE), emitida por entidades como UNE, UBES e ANPG. O estudante.id não é uma CIE.
  • Identificar uma pessoa — não é documento de identidade.
  • Nada voltado a menores: o estudante.id cobre o ensino superior, 18+.

Como o estudante compartilha

O estudante abre o ID dele no estudante.id e mostra o código de 10 caracteres ou o QR code.

O QR code abre https://estudante.id/v/{CÓDIGO}. Se você ler o QR, use o último trecho do caminho como código. Maiúsculas e minúsculas tanto faz.

Autenticação

Toda requisição leva sua chave no cabeçalho Authorization. As chaves começam com eid_test_ (modo de teste) ou eid_live_ (produção).

Chame a API só do seu servidor. Ela não envia cabeçalhos CORS de propósito: chave dentro de página web ou de app é chave vazada. Se uma chave vazar, peça a revogação — uma nova sai em minutos.

HTTP
Authorization: Bearer eid_live_…

Consultar um código

GET https://estudante.id/api/v1/verifications/{code}

Devolve a verificação ligada a um código. Verificações vencidas voltam com 200 e "verified": false, para você poder explicar o motivo ao estudante.

200 OK
{
  "object": "student_verification",
  "status": "verified",
  "verified": true,
  "name": "Ana S.",
  "institution": {
    "name": "Universidade de Teste",
    "acronym": "UTESTE",
    "emec_code": 0,
    "city": "São Paulo",
    "uf": "SP"
  },
  "age_over_18": true,
  "verified_at": "2026-03-01T12:00:00.000Z",
  "valid_until": "2099-03-01T12:00:00.000Z",
  "code": "TESTVALID1",
  "checked_at": "2026-10-02T18:30:00.000Z",
  "livemode": false
}

Campos da resposta

CampoDescrição
verifiedtrue só quando a verificação está ativa. Conceda o benefício apenas com true.
status"verified" ou "expired".
namePrimeiro nome e inicial do sobrenome, se o estudante cadastrou um nome. Pode ser null.
institutionNome, sigla, código e-MEC, cidade e UF da instituição.
age_over_18O estudante declarou ter 18 anos ou mais ao se verificar.
verified_at / valid_untilQuando a verificação aconteceu e até quando vale (ISO 8601, UTC).
livemodefalse para chaves de teste.

Erros

Todos os erros têm o mesmo formato: { "error": { "code", "message", "docs" } }.

StatusCódigoSignificado
400invalid_codeO código não tem 10 letras e números.
401missing_api_key / invalid_api_keySem chave, ou uma chave que não reconhecemos.
403revoked_api_keyA chave foi revogada.
404not_foundNenhuma verificação ativa para este código. Pedidos em análise, recusados e códigos inexistentes respondem igual, de propósito.
429rate_limitedChamadas demais neste minuto. Espere os segundos de Retry-After.
500server_errorProblema do nosso lado. Tente de novo com intervalo crescente.

Modo de teste

Uma chave de teste nunca toca dados reais de estudantes. Ela responde só a estes códigos:

CódigoSignificado
TESTVALID1200 — verificado
TESTEXPIRD200 — vencido ("verified": false)
qualquer outro404 — not_found

Exemplos

curl
curl https://estudante.id/api/v1/verifications/TESTVALID1 \
  -H "Authorization: Bearer $ESTUDANTE_ID_KEY"
Node.js
const res = await fetch(
  `https://estudante.id/api/v1/verifications/${encodeURIComponent(code)}`,
  { headers: { Authorization: `Bearer ${process.env.ESTUDANTE_ID_KEY}` } },
);
if (res.status === 404) return { grant: false };
if (!res.ok) throw new Error(`estudante.id ${res.status}`);
const verification = await res.json();
return { grant: verification.verified === true, verification };
Python
import os, requests

r = requests.get(
    f"https://estudante.id/api/v1/verifications/{code}",
    headers={"Authorization": f"Bearer {os.environ['ESTUDANTE_ID_KEY']}"},
    timeout=5,
)
if r.status_code == 404:
    grant = False
else:
    r.raise_for_status()
    grant = r.json()["verified"] is True

Limites

  • 60 requisições por minuto por chave, por padrão. Precisa de mais? Fale com a gente.
  • As respostas nunca são cacheadas (Cache-Control: no-store). Consulte no momento de conceder o benefício, não antes.
  • O contrato só cresce: campos novos podem aparecer nas respostas; os existentes não mudam de significado.

Privacidade e LGPD

  • Nunca compartilhamos o e-mail, o CPF ou o nome completo do estudante.
  • Uma consulta só é possível com o código que o estudante escolheu te mostrar, e toda consulta aparece para ele na página do ID, com o nome da sua empresa.
  • Guarde só o necessário para comprovar que o benefício foi concedido — o código, o resultado e a data. Você é o controlador do que guardar.

Verificar com estudante.id

Acesso antecipado

Para checkout online: um botão "Verificar com estudante.id". O estudante entra, vê qual empresa está pedindo e aprova; seu servidor recebe uma confirmação assinada que ele confere sozinho — sem digitar código.

Você recebe só: estudante verificado, instituição, validade e 18+, com um identificador exclusivo da sua empresa, para que dois parceiros não consigam cruzar o mesmo estudante.

Estamos construindo junto com parceiros piloto. Conte como é o seu checkout no formulário abaixo.

Pedir uma chave

Conte quem você é e como pretende usar. Todo parceiro começa com uma chave de teste.

Tenho interesse em