Skip to main content

Suapy — biblioteca Python para a API do SUAP

Suapy

Consulte boletim, faltas, horários e avaliações do SUAP com Python ou pelo terminal. Os métodos são em português e usam a API do IFRN por padrão. Outras instituições podem ter endpoints ou permissões diferentes; a compatibilidade não é garantida.

PyPI · Código-fonte · Relatar problema

Documentação completa · Fonte da documentação

Instalação

Requer Python 3.10 ou superior. A versão 1.4 passa a exigir esse mínimo.

python -m pip install suapy

Para usar a conversão de dados com Pandas:

python -m pip install "suapy[pandas]"

Pelo terminal

suapy

Consultas diretas e exportações (1.4.1):

suapy periodos
suapy boletim --ano 2026 --periodo 2
suapy boletim --ano 2026 --periodo 2 --formato csv --saida boletim.csv
suapy avaliacoes --formato json
suapy mensagens --status todas --formato json
suapy --sem-sessao

--sem-sessao não lê nem modifica o token salvo. --saida cria um arquivo novo, sem sobrescrever exportações. CSV e JSON não precisam de Pandas. Avisos e prompts usam stderr; os dados exportados usam stdout ou o arquivo escolhido. --url-base permite outra instituição, sem reutilizar a sessão salva do IFRN.

Informe sua matrícula e senha. O menu permite consultar boletim e faltas, horário do dia, progresso do curso e eventos. A senha não aparece enquanto você digita.

O terminal guarda um refresh token em ~/.suapy/session.json para restaurar o acesso. Esse arquivo contém uma credencial em texto simples, embora não contenha sua senha. Em sistemas POSIX, a pasta tem permissão 700 e o arquivo 600; em outros sistemas, o acesso depende das permissões da conta e do diretório.

A opção Sair mantém a sessão. Para removê-la deste computador, use a opção Encerrar sessão e sair ou execute:

suapy --logout

Isso remove o token local; não o revoga no servidor.

Em Python

O exemplo consulta os períodos disponíveis e busca o boletim do mais recente. A senha é solicitada no terminal, sem ficar escrita no código.

from getpass import getpass
from suapy import Suap, SuapError

try:
    with Suap() as suap:
        suap.login(input("Matrícula: "), getpass("Senha: "))

        periodos = list(suap.iterar_resultados(
            suap.ensino.obter_periodos_letivos()
        ))
        if periodos:
            atual = max(periodos, key=lambda p: (
                int(p["ano_letivo"]), int(p["periodo_letivo"])
            ))
            resposta = suap.ensino.obter_boletim(
                atual["ano_letivo"], atual["periodo_letivo"]
            )
            for disciplina in suap.iterar_resultados(resposta):
                print(
                    disciplina.get("disciplina", "Sem nome"),
                    "— faltas:", disciplina.get("numero_faltas", "—"),
                    "— média:", disciplina.get("media_final_disciplina", "—"),
                )
        else:
            print("Nenhum período letivo disponível.")
except SuapError as erro:
    print(f"Não foi possível consultar o SUAP: {erro}")

O bloco with fecha as conexões ao terminar. Sem ele, chame suap.fechar(). A biblioteca mantém tokens somente em memória; a gravação em disco é uma função do CLI.

Identificar a conta

Para validar uma conta no login de outro sistema, autenticar faz o login, devolve um Perfil com campos estáveis e fecha a conexão sem guardar tokens. A senha só é enviada ao SUAP.

from suapy import SuapAuthError, autenticar

try:
    perfil = autenticar(matricula, senha)
except SuapAuthError:
    print("Matrícula ou senha inválidas.")
else:
    if perfil.aluno_ativo:
        print(perfil.nome, perfil.email, perfil.vinculo_aluno_ativo.curso)

Com um cliente já autenticado, use suap.obter_perfil(). O Perfil reúne matricula, nome, email, campus, tipo_usuario, foto e vinculos; aluno_ativo indica se há vínculo de aluno ativo. Os dados vêm de /api/rh/eu/ e /api/rh/meus-vinculos/.

Consultas disponíveis

Os retornos dependem do perfil da conta e dos dados cadastrados na instituição.

Método de suap.ensino Consulta
obter_dados_aluno() Dados institucionais do aluno
obter_periodos_letivos() Períodos disponíveis para consulta
obter_boletim(ano, periodo) Notas, faltas e situação por disciplina
obter_proximas_avaliacoes() Avaliações cadastradas
obter_turmas_virtuais(ano, periodo) Turmas, horários e locais de aula
obter_turma_virtual(pk) Detalhes de uma turma
obter_mensagens_aluno(status="nao_lidas") Mensagens: nao_lidas, lidas ou todas
obter_requisitos_conclusao() Progresso e carga horária do curso
obter_eventos() Eventos institucionais
obter_diarios(ano=None, periodo=None) Diários; pode exigir perfil de professor

Para faltas e notas de alunos, use obter_boletim(). A biblioteca também expõe os módulos usuario (inclusive obter_meus_vinculos()), infraestrutura e pesquisa_extensao; consulte os métodos no código.

Respostas e paginação

Os métodos devolvem o JSON da API sem alterar sua estrutura. Uma consulta pode retornar uma lista, um objeto ou uma página com results e next.

Na 1.4.1, páginas são dicionários que também preservam a URL original em um atributo, para resolver links relativos como ?page=2. Para um JSON externo, use iterar_resultados(resposta, url_origem="https://servidor/api/lista/"). Prefixos de instalação em url_base, como /suap, são preservados nos endpoints.

Para uma consulta de listagem, suap.iterar_resultados(resposta) aceita tanto listas quanto páginas e busca as páginas seguintes conforme você itera. Objetos de detalhe, como os dados do aluno, devem ser usados diretamente.

# Com suap já autenticado:
resposta = suap.ensino.obter_proximas_avaliacoes()
for avaliacao in suap.iterar_resultados(resposta):
    print(avaliacao.get("disciplina"), avaliacao.get("data_avaliacao"))

O iterador rejeita links de outra origem e ciclos de paginação. Ele não ordena os registros; a primeira avaliação recebida não é necessariamente a próxima por data.

Análise com Pandas

import pandas as pd
from suapy import para_dataframe

# Com suap autenticado e ano/periodo escolhidos:
resposta = suap.ensino.obter_boletim(ano, periodo)
df = para_dataframe(list(suap.iterar_resultados(resposta)))

if "media_final_disciplina" in df.columns:
    notas = pd.to_numeric(df["media_final_disciplina"], errors="coerce")
    if notas.notna().any():
        print(f"Média simples das notas disponíveis: {notas.mean():.2f}")

Essa média não representa necessariamente o índice acadêmico da instituição. Para converter apenas uma página envelopada, use para_dataframe(resposta, chave="results"). A conversão não busca outras páginas. O Pandas só é importado quando essa função é chamada.

Horários

from suapy import parse_horario

for aula in parse_horario("2V34 / 4V56"):
    print(aula["dia_semana"], aula["turno"], aula["horarios"])
# Segunda Tarde [3, 4]
# Quarta Tarde [5, 6]

Os números indicam tempos de aula, não horas do relógio. Os horários exatos dependem do campus. Trechos que não correspondem ao formato são ignorados.

Conexão e erros

from suapy import Suap

suap = Suap(
    url_base="https://suap.ifrn.edu.br",
    timeout=(5, 30),  # conexão e espera de leitura, em segundos
)
suap.fechar()

A verificação TLS fica habilitada. Redirecionamentos HTTP não são seguidos. Ao receber 401, o cliente tenta renovar o token e repetir a chamada uma vez, se houver refresh token. Não há repetição automática para falhas de rede.

Exceção Situação
ValueError Ano/período, status de mensagem ou URL base inválidos
SuapAuthError Autenticação inválida, token ausente ou acesso negado (401/403)
SuapApiError Outros erros HTTP, JSON inválido ou paginação inválida
SuapError Classe base; também cobre timeout e falha de conexão

Capture as exceções específicas antes de SuapError quando precisar distinguir as causas. SuapApiError disponibiliza status_code e response quando aplicáveis.

Desenvolvimento

Veja o guia de contribuição para instalar o projeto, executar os testes e preparar uma distribuição. As mudanças estão no changelog.

Projeto independente, sem afiliação oficial ao IFRN ou ao SUAP. Distribuído sob a licença MIT.

Metadata

Release files for suapy 1.4.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for suapy 1.4.1
File Size Uploaded
suapy-1.4.1.tar.gz 981.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for suapy 1.4.1
File Interpreter ABI Platform
suapy-1.4.1-py3-none-any.whl Python 3 none any Details

Total release size: 1.0 MB

Release files / suapy-1.4.1.tar.gz

Download URL suapy-1.4.1.tar.gz
Size 981.8 kB
Tags Source
SHA-256 checksum
How to use checksums
3935c831c6ff299656f4decde5f6b1a61e8de9300afe62b91daf1e5bef19131f
BLAKE2b-256 checksum
How to use checksums
fdbb2a0b4e8b2c1bbd32ab528d0a5b5177f68afeaf18905c0ff2998e262be3e6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.

Transparency log

Release files / suapy-1.4.1-py3-none-any.whl

Download URL suapy-1.4.1-py3-none-any.whl
Size 19.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
aed7a64671e9053af4d3d4ce1e3665232cb5cf952a30def2b9a0477c2e812b57
BLAKE2b-256 checksum
How to use checksums
21cfdde94ffd34e766f037a37c25cf19db20b5d9da403725f2efa13ee777878b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

1.4.1 This release

2 release files

1.4.0

2 release files

1.3.0

2 release files

1.2.0

2 release files

1.1.0

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page