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
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.
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.
Resposta do login/registo
—
Authorization: Bearer … nas operações protegidas.
JWT HS256. No login/registo a API pode devolver perfil_contexto (tipo_utilizador, empresas_geridas, …).
| Path | Descriçã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. |
# 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"}'
Sem Authorization. Parâmetros completos no Swagger. Não inclui notificações — GET /api/notificacoes exige JWT (secção «Conta (JWT)»).
| Path | Notas | |
|---|---|---|
| GET | /api/cidades | Lista de cidades. |
| GET | /api/documentos-legais | Termos, privacidade, LGPD (listagem). |
| GET | /api/documentos-legais/{slug} | Texto integral do documento. |
| GET | /api/categorias | Categorias (strings). |
| GET | /api/empresas | cidade_id, cidade, categoria, limite, cursor, lat/lon. |
| GET | /api/empresas/{id} | Detalhe; lat/lon opcionais. |
| GET | /api/empresas/{id}/comentarios | Comentários. |
| GET | /api/ofertas | Filtros: cidade, empresa, ativas, cursor, geo, … |
| GET | /api/ofertas/{id} | Detalhe da oferta. |
| POST | /api/analise/imagem | Multipart: image ou url. Resposta: aprovado, analise (percentuais), predominante, medidor_risco_percentual. Sem JWT. Guia. |
| GET | /api/pacotes-creditos | Catálogo de pacotes. |
| GET | /api/catalogo/tipos-oferta/manifest | Manifesto dos tipos. |
| GET | /api/catalogo/tipos-oferta/{id} | JSON do tipo (ex.: id do manifest). |
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"
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 [].
| Path | Corpo / notas | |
|---|---|---|
| GET | /api/usuario/eu | Perfil, tipo_utilizador, empresas_geridas (se empresa). |
| PUT | /api/usuario/perfil | nome_completo, url_avatar, cidade_id (ou null). |
| PUT | /api/usuario/dispositivo | token_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/notificacoes | Só autenticado (não é público). Feed filtrado; limite opcional. |
| GET | /api/exemplo/protegido | Teste do token. |
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}'
| HTTP | erro | Significado |
|---|---|---|
| 400 | json_invalido / parametros_invalidos | Pedido inválido. |
| 401 | credenciais_invalidas / nao_autorizado | Login ou token. |
| 404 | nao_encontrado | Recurso inexistente. |
| 409 | email_ja_registrado | Email já usado no registo. |
| 503 | banco_indisponivel | Serviço de dados indisponível. |