API App Ofertas

Base: https://ofertup.shop/Notificações e dados de conta exigem JWT (não há feed público). Login na app: Google ou email+código; senha só legado. Swagger + referência no acordeão abaixo.

OpenAPI: /documentacao/openapi.yaml

Swagger — referência interativa

Use Try it out em cada operação. Rotas com cadeado precisam de Authorize (Bearer): o token pode vir do Google, código por email ou login com senha (ver acordeão «Autenticação»). GET /api/notificacoes é uma delas — sem token recebe 401.

Token JWT — login, registo e sincronizar com o Swagger

Na app: use Google ou email + código (rotas na tabela «Autenticação»). Aqui podes testar login com senha ou registo (legado) para preencher o access_token e clicar Aplicar no Swagger (Authorize) — o mesmo token serve para perfil, seguir, guardadas e notificações.

Login

Registo

Resposta do login/registo

Token e Authorize

Authorization: Bearer … nas operações protegidas.

Autenticação — listagem e exemplos curl

JWT HS256. No login/registo a API pode devolver perfil_contexto (tipo_utilizador, empresas_geridas, …).

PathDescrição
POST /api/autenticacao/google App: {"id_token":"…"} (Google Sign-In). Primeira vez cria utilizador; mesmo JWT.
POST /api/autenticacao/codigo/solicitar {"email"} — envia código (SMTP no .env).
POST /api/autenticacao/codigo/confirmar {"email","codigo"} — JWT; primeira vez cria conta sem senha.
POST /api/autenticacao/token Legado: login com {"email","senha"} (só contas com senha).
POST /api/autenticacao/registro Legado: registo com senha → 201 com token.
Exemplos curl
# Google (colar id_token real da app)
curl -s -X POST "https://ofertup.shop/api/autenticacao/google" \
  -H "Content-Type: application/json" \
  -d '{"id_token":"COLAR_ID_TOKEN"}'

curl -s -X POST "https://ofertup.shop/api/autenticacao/codigo/solicitar" \
  -H "Content-Type: application/json" \
  -d '{"email":"tu@exemplo.com"}'

curl -s -X POST "https://ofertup.shop/api/autenticacao/codigo/confirmar" \
  -H "Content-Type: application/json" \
  -d '{"email":"tu@exemplo.com","codigo":"123456"}'

curl -s -X POST "https://ofertup.shop/api/autenticacao/token" \
  -H "Content-Type: application/json" \
  -d '{"email":"admin@local.test","senha":"sua_senha"}'
Rotas públicas — listagem e exemplos curl

Sem Authorization. Parâmetros completos no Swagger. Não inclui notificaçõesGET /api/notificacoes exige JWT (secção «Conta (JWT)»).

PathNotas
GET/api/cidadesLista de cidades.
GET/api/documentos-legaisTermos, privacidade, LGPD (listagem).
GET/api/documentos-legais/{slug}Texto integral do documento.
GET/api/categoriasCategorias (strings).
GET/api/empresascidade_id, cidade, categoria, limite, cursor, lat/lon.
GET/api/empresas/{id}Detalhe; lat/lon opcionais.
GET/api/empresas/{id}/comentariosComentários.
GET/api/ofertasFiltros: cidade, empresa, ativas, cursor, geo, …
GET/api/ofertas/{id}Detalhe da oferta.
POST/api/analise/imagemMultipart: image ou url. Resposta: aprovado, analise (percentuais), predominante, medidor_risco_percentual. Sem JWT. Guia.
GET/api/pacotes-creditosCatálogo de pacotes.
GET/api/catalogo/tipos-oferta/manifestManifesto dos tipos.
GET/api/catalogo/tipos-oferta/{id}JSON do tipo (ex.: id do manifest).
Exemplos curl
curl -s "https://ofertup.shop/api/cidades"
curl -s "https://ofertup.shop/api/documentos-legais"
curl -s "https://ofertup.shop/api/empresas?cidade_id=1&limite=20"
curl -s "https://ofertup.shop/api/ofertas?apenas_ativas=true&incluir_empresa=true&limite=10"
Conta e preferências (JWT) — listagem e exemplos curl

Todas estas rotas exigem Authorization: Bearer (token de Google, código por email ou login com senha). Respostas 204 sem corpo onde indicado. Notificações: só autenticado; feed filtrado por empresas que segue e por ofertas guardadas / empresas seguidas — sem isso a lista pode vir vazia [].

PathCorpo / notas
GET/api/usuario/euPerfil, tipo_utilizador, empresas_geridas (se empresa).
PUT/api/usuario/perfilnome_completo, url_avatar, cidade_id (ou null).
PUT/api/usuario/dispositivotoken_fcm, plataforma (android|ios).
GET/api/usuario/seguindo{"ids":[]}
PUT/api/usuario/seguindo{"ids":["1","2"]} substitui a lista.
GET/api/usuario/ofertas-guardadas{"ids":[]}
PUT/api/usuario/ofertas-guardadas{"ids":[]}
GET/api/usuario/ofertas-lidas{"ids":[]}
PUT/api/usuario/ofertas-lidas{"ids":[]}
GET/api/notificacoesSó autenticado (não é público). Feed filtrado; limite opcional.
GET/api/exemplo/protegidoTeste do token.
Exemplos curl
TOKEN="cole_o_access_token"
curl -s "https://ofertup.shop/api/usuario/eu" -H "Authorization: Bearer $TOKEN"
curl -s "https://ofertup.shop/api/notificacoes?limite=20" -H "Authorization: Bearer $TOKEN"
curl -s "https://ofertup.shop/api/exemplo/protegido" -H "Authorization: Bearer $TOKEN"
curl -s -X PUT "https://ofertup.shop/api/usuario/perfil" \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"nome_completo":"Maria","cidade_id":1}'
Erros habituais
HTTPerroSignificado
400json_invalido / parametros_invalidosPedido inválido.
401credenciais_invalidas / nao_autorizadoLogin ou token.
404nao_encontradoRecurso inexistente.
409email_ja_registradoEmail já usado no registo.
503banco_indisponivelServiço de dados indisponível.