Versão: 1.2.0
Data de Atualização: 13 de fevereiro de 2026
Status: Em Produção
Base URL: http://localhost:3001 (desenvolvimento) | https://api.doecerto.com.br (produção)
- Legenda de Autorização
- Autenticação
- Usuários
- Doadores
- ONGs
- Perfis
- Doações
- Categorias
- Avaliações
- Endereços
- Contas Bancárias
- Wishlist
- Catálogo
- Administração
- Códigos de Status HTTP
- Exemplos de Requisições
| Símbolo | Significado | Descrição |
|---|---|---|
| 🔓 | Public | Sem autenticação obrigatória |
| 🔒 | Authenticated | Requer JWT válido |
| 👤 | Donor Only | Apenas doadores |
| 🏢 | ONG Only | Apenas ONGs |
| 👑 | Admin Only | Apenas administradores |
| 🔑 | Self or Admin | Próprio usuário ou administrador |
Autentica um usuário existente.
Request Body:
{
"email": "usuario@example.com",
"password": "senha123"
}Response (200 OK):
{
"message": "Login successful",
"accessToken": "eyJhbGc...",
"user": {
"id": 1,
"name": "João Silva",
"email": "joao@example.com",
"role": "donor"
}
}Erros Possíveis:
401 Unauthorized- Email ou senha inválidos
Registra um novo doador.
Request Body:
{
"name": "João Silva",
"email": "joao@example.com",
"password": "senha123",
"cpf": "123.456.789-00"
}Response (201 Created):
{
"message": "Donor registered successfully",
"accessToken": "eyJhbGc...",
"user": {
"id": 1,
"name": "João Silva",
"email": "joao@example.com",
"role": "donor"
},
"profile": {
"userId": 1,
"cpf": "123.456.789-00"
}
}Validações:
- CPF deve ser válido (formato: 000.000.000-00)
- Email deve ser único
- Senha mínimo 8 e máximo 128 caracteres
Erros Possíveis:
409 Conflict- Email ou CPF já registrado400 Bad Request- CPF ou email inválidos
Registra uma nova ONG.
Request Body:
{
"name": "ONG Esperança",
"email": "contato@ongesperanca.com",
"password": "senha123",
"cnpj": "12.345.678/0001-90"
}Response (201 Created):
{
"message": "ONG registered successfully",
"accessToken": "eyJhbGc...",
"user": {
"id": 2,
"name": "ONG Esperança",
"email": "contato@ongesperanca.com",
"role": "ong"
},
"profile": {
"userId": 2,
"cnpj": "12.345.678/0001-90",
"verificationStatus": "pending"
}
}Validações:
- CNPJ deve ser válido (formato: 00.000.000/0000-00)
- Email deve ser único
- Senha mínimo 8 e máximo 128 caracteres
Erros Possíveis:
409 Conflict- Email ou CNPJ já registrado400 Bad Request- CNPJ ou email inválidos
Realiza logout do usuário autenticado.
Response (200 OK):
{
"message": "Logout successful"
}Solicita link de recuperação de senha.
Request Body:
{
"email": "usuario@example.com"
}Response (200 OK):
{
"message": "Se o email existir na plataforma, um link de recuperação será enviado"
}Nota: Resposta genérica por segurança (não revela se email existe)
Valida um token de reset de senha.
Request Body:
{
"token": "token_hash_aqui"
}Response (200 OK):
{
"valid": true
}Redefine a senha usando um token válido.
Request Body:
{
"token": "token_hash_aqui",
"newPassword": "nova_senha_123"
}Response (200 OK):
{
"message": "Senha atualizada com sucesso"
}Validações:
- Nova senha mínimo 8 e máximo 128 caracteres
Erros Possíveis:
400 Bad Request- Token inválido ou expirado
Cria um novo usuário diretamente (uso administrativo).
Request Body:
{
"name": "Admin User",
"email": "admin@example.com",
"password": "senha123",
"role": "admin"
}Response (201 Created):
{
"id": 1,
"name": "Admin User",
"email": "admin@example.com",
"role": "admin",
"createdAt": "2024-01-15T10:30:00Z",
"updatedAt": "2024-01-15T10:30:00Z"
}Lista todos os usuários (com paginação).
Query Parameters:
skip(int, default: 0) - Número de registros a pulartake(int, default: 20, máx: 100) - Quantidade de registros
Response (200 OK):
{
"data": [
{
"id": 1,
"name": "João Silva",
"email": "joao@example.com",
"role": "donor",
"createdAt": "2024-01-01T08:00:00Z",
"updatedAt": "2024-01-15T10:30:00Z"
}
],
"pagination": {
"skip": 0,
"take": 20,
"total": 150,
"pages": 8
}
}Obtém dados do usuário autenticado.
Response (200 OK):
{
"id": 1,
"name": "João Silva",
"email": "joao@example.com",
"role": "donor",
"createdAt": "2024-01-01T08:00:00Z",
"updatedAt": "2024-01-15T10:30:00Z"
}Obtém dados de um usuário específico.
Response (200 OK):
{
"id": 5,
"name": "Maria Santos",
"email": "maria@example.com",
"role": "ong",
"createdAt": "2024-01-05T12:00:00Z",
"updatedAt": "2024-01-15T10:30:00Z"
}Atualiza dados do usuário autenticado.
Request Body:
{
"name": "João Silva Atualizado",
"email": "joao.novo@example.com"
}Response (200 OK):
{
"id": 1,
"name": "João Silva Atualizado",
"email": "joao.novo@example.com",
"role": "donor",
"createdAt": "2024-01-01T08:00:00Z",
"updatedAt": "2024-01-15T15:45:00Z"
}Atualiza dados de um usuário específico (admin).
Request Body:
{
"name": "Nome Atualizado",
"password": "nova_senha"
}Response (200 OK):
Similar ao PATCH /users/me
Deleta um usuário.
Response (204 No Content)
Cria um novo doador (geralmente via POST /auth/register/donor).
Request Body:
{
"name": "João Silva",
"email": "joao@example.com",
"password": "senha123",
"cpf": "123.456.789-00"
}Response (201 Created):
{
"userId": 1,
"cpf": "123.456.789-00",
"user": {
"id": 1,
"name": "João Silva",
"email": "joao@example.com"
}
}Lista todos os doadores.
Query Parameters:
skip(int, default: 0)take(int, default: 20, máx: 100)
Response (200 OK):
{
"data": [
{
"userId": 1,
"cpf": "123.456.789-00",
"user": {
"id": 1,
"name": "João Silva",
"email": "joao@example.com"
}
}
],
"pagination": {
"skip": 0,
"take": 20,
"total": 500,
"pages": 25
}
}Obtém dados de um doador específico.
Response (200 OK):
{
"userId": 1,
"cpf": "123.456.789-00",
"user": {
"id": 1,
"name": "João Silva",
"email": "joao@example.com"
}
}Atualiza dados do doador autenticado.
Request Body:
{
"cpf": "987.654.321-00"
}Response (200 OK):
{
"userId": 1,
"cpf": "987.654.321-00",
"user": {
"id": 1,
"name": "João Silva",
"email": "joao@example.com"
}
}Deleta um doador.
Response (204 No Content)
Cria uma nova ONG (geralmente via POST /auth/register/ong).
Request Body:
{
"name": "ONG Esperança",
"email": "contato@ongesperanca.com",
"password": "senha123",
"cnpj": "12.345.678/0001-90"
}Response (201 Created):
{
"userId": 2,
"cnpj": "12.345.678/0001-90",
"verificationStatus": "pending",
"user": {
"id": 2,
"name": "ONG Esperança",
"email": "contato@ongesperanca.com"
}
}Lista todas as ONGs (paginado).
Query Parameters:
skip(int, default: 0)take(int, default: 20, máx: 100)
Response (200 OK):
{
"data": [
{
"userId": 2,
"cnpj": "12.345.678/0001-90",
"verificationStatus": "verified",
"verifiedAt": "2024-01-10T14:00:00Z",
"user": {
"id": 2,
"name": "ONG Esperança",
"email": "contato@ongesperanca.com"
}
}
],
"pagination": {
"skip": 0,
"take": 20,
"total": 250,
"pages": 13
}
}Obtém dados de uma ONG específica.
Response (200 OK):
{
"userId": 2,
"cnpj": "12.345.678/0001-90",
"verificationStatus": "verified",
"verifiedAt": "2024-01-10T14:00:00Z",
"user": {
"id": 2,
"name": "ONG Esperança",
"email": "contato@ongesperanca.com"
}
}Lista ONGs verificadas dentro de 10km da localização do usuário.
Pré-requisitos:
- Usuário autenticado
- Usuário deve ter endereço com latitude e longitude configurados
Response (200 OK):
{
"data": [
{
"id": 2,
"userId": 2,
"name": "ONG Esperança",
"avatarUrl": "/uploads/profiles/ong-esperanca.jpg",
"bannerUrl": "/uploads/profiles/ong-esperanca-banner.jpg",
"description": "Dedicada à educação infantil",
"averageRating": 4.5,
"numberOfRatings": 10,
"distance": 2.35,
"address": {
"street": "Rua das Flores",
"number": "123",
"neighborhood": "Centro",
"city": "São Paulo",
"state": "SP",
"zipCode": "01234-567"
}
}
],
"pagination": {
"skip": 0,
"take": 20,
"total": 5,
"pages": 1
}
}Erros Possíveis:
400 Bad Request- Usuário sem endereço com localização
Atualiza dados da ONG autenticada.
Request Body:
{
"cnpj": "98.765.432/0001-10"
}Response (200 OK):
{
"userId": 2,
"cnpj": "98.765.432/0001-10",
"verificationStatus": "verified",
"verifiedAt": "2024-01-10T14:00:00Z",
"user": {
"id": 2,
"name": "ONG Esperança",
"email": "contato@ongesperanca.com"
}
}Deleta uma ONG.
Response (204 No Content)
Cria ou atualiza o perfil do doador autenticado.
Content-Type: multipart/form-data
Form Fields:
file(file, opcional) - Imagem de avatardescription(string, max 500 caracteres, opcional)contactNumber(string, max 20 caracteres, opcional)
Response (200 OK):
{
"id": 1,
"donorId": 1,
"description": "Apaixonado por causas sociais",
"avatarUrl": "/uploads/profiles/avatar-12345.jpg",
"contactNumber": "(11) 9 9999-8888",
"createdAt": "2024-01-15T10:30:00Z",
"updatedAt": "2024-01-15T10:30:00Z",
"donor": {
"userId": 1,
"cpf": "123.456.789-00",
"user": {
"id": 1,
"name": "João Silva",
"email": "joao@example.com"
}
}
}Obtém o perfil do doador autenticado.
Response (200 OK): Retorna o perfil quando ele existe
Similar ao POST, sem o campo createdAt
Response (204 No Content): Quando o doador ainda não criou seu perfil (é opcional)
Obtém o perfil público de um doador.
Response (200 OK): Retorna o perfil quando ele existe
Similar ao GET /donors/me/profile
Erros Possíveis:
404 Not Found- Quando o doador não tem um perfil criado (perfil é opcional)
Cria ou atualiza o perfil da ONG autenticada.
Content-Type: multipart/form-data
Form Fields:
avatar(file, opcional) - Imagem do avatar (512x512)banner(file, opcional) - Imagem do banner (1920x1080)description(string, max 500 caracteres, opcional)yearsOfOperation(integer, opcional)contactNumber(string, max 20 caracteres, opcional)website(string ou string[], opcional) - Uma ou várias URLscategoryIds[](integer array, opcional) - IDs das categoriasbankAccount(JSON object, opcional) - Dados da conta bancária
Exemplo com cURL:
curl -X POST http://localhost:3001/ongs/me/profile \
-H "Authorization: Bearer TOKEN" \
-F "avatar=@avatar.jpg" \
-F "banner=@banner.jpg" \
-F "description=ONG dedicada à educação" \
-F "yearsOfOperation=12" \
-F "website=https://ongesperanca.com.br" \
-F "website=https://parceiro.ongesperanca.com.br" \
-F "contactNumber=(11) 98765-4321" \
-F "categoryIds=1" \
-F "categoryIds=2"Response (200 OK):
{
"id": 1,
"ongId": 2,
"description": "ONG dedicada à educação",
"yearsOfOperation": 12,
"avatarUrl": "/uploads/profiles/avatar-12345.jpg",
"bannerUrl": "/uploads/profiles/banner-12345.jpg",
"contactNumber": "(11) 98765-4321",
"website": [
"https://ongesperanca.com.br",
"https://parceiro.ongesperanca.com.br"
],
"categories": [
{
"id": 1,
"name": "Educação"
},
{
"id": 2,
"name": "Saúde"
}
],
"ong": {
"userId": 2,
"cnpj": "12.345.678/0001-90",
"averageRating": 4.5,
"numberOfRatings": 10,
"user": {
"id": 2,
"name": "ONG Esperança",
"email": "contato@ongesperanca.com"
}
}
}Obtém o perfil completo e público de uma ONG.
Response (200 OK):
{
"id": 2,
"name": "ONG Esperança",
"email": "contato@ongesperanca.com",
"avatarUrl": "/uploads/profiles/avatar-12345.jpg",
"bannerUrl": "/uploads/profiles/banner-12345.jpg",
"description": "ONG dedicada à educação infantil",
"yearsOfOperation": 12,
"contactNumber": "(11) 98765-4321",
"website": [
"https://ongesperanca.com.br",
"https://parceiro.ongesperanca.com.br"
],
"receivedDonations": 45,
"rating": {
"average": 4.5,
"count": 10
},
"categories": [
{
"id": 1,
"name": "Educação"
},
{
"id": 2,
"name": "Saúde"
}
],
"address": {
"street": "Rua das Flores",
"number": "123",
"neighborhood": "Centro",
"city": "São Paulo",
"state": "SP",
"zipCode": "01234-567",
"latitude": -23.5505,
"longitude": -46.6333
},
"bankAccounts": [
{
"bankName": "Banco do Brasil",
"agencyNumber": "1234-5",
"accountNumber": "12345-6",
"accountType": "Corrente",
"pixKey": "contato@ongesperanca.com.br"
}
],
"createdAt": "2024-01-10T14:00:00Z",
"updatedAt": "2024-01-15T10:30:00Z"
}Erros Possíveis:
404 Not Found- Quando a ONG ainda não criou o perfil (perfil é opcional)
Cria uma nova doação.
Content-Type: multipart/form-data (se houver comprovante)
Form Fields:
proofFile(file, opcional) - Comprovante de pagamento (JPG, PNG, PDF)createDonationDto(JSON, obrigatório)
JSON Body (createDonationDto):
{
"ongId": 2,
"donationType": "monetary",
"monetaryAmount": 150.5,
"monetaryCurrency": "BRL"
}Ou para material:
{
"ongId": 2,
"donationType": "material",
"materialDescription": "Alimentos não-perecíveis",
"materialQuantity": 10
}Response (201 Created):
{
"id": 1,
"donationType": "monetary",
"donationStatus": "pending",
"monetaryAmount": 150.5,
"monetaryCurrency": "BRL",
"materialDescription": null,
"materialQuantity": null,
"proofOfPaymentUrl": "/uploads/payment-proofs/proof-12345.jpg",
"createdAt": "2024-01-15T10:30:00Z",
"updatedAt": "2024-01-15T10:30:00Z",
"ong": {
"userId": 2,
"cnpj": "12.345.678/0001-90",
"verificationStatus": "verified",
"user": {
"id": 2,
"name": "ONG Esperança",
"email": "contato@ongesperanca.com"
}
},
"donor": {
"userId": 1,
"cpf": "123.456.789-00",
"user": {
"id": 1,
"name": "João Silva",
"email": "joao@example.com"
}
}
}Validações:
- ONG deve estar verificada (
verificationStatus: "verified") - ONG deve existir
- Campos adequados ao tipo de doação
Erros Possíveis:
400 Bad Request- ONG não verificada ou dados inválidos404 Not Found- ONG não encontrada
Lista todas as doações (paginado).
Query Parameters:
skip(int, default: 0)take(int, default: 20, máx: 100)
Response (200 OK):
{
"data": [
{
"id": 1,
"donationType": "monetary",
"donationStatus": "pending",
"monetaryAmount": 150.50,
"monetaryCurrency": "BRL",
"createdAt": "2024-01-15T10:30:00Z",
"ong": { ... },
"donor": { ... }
}
],
"pagination": {
"skip": 0,
"take": 20,
"total": 1000,
"pages": 50
}
}Lista doações enviadas pelo doador autenticado.
Query Parameters:
type(string, opcional) - Filtrar por tipo:monetaryoumaterialskip(int, default: 0)take(int, default: 20, máx: 100)
Response (200 OK):
Similar ao GET /donations
Lista doações recebidas pela ONG autenticada.
Query Parameters:
type(string, opcional) -monetaryoumaterialskip(int, default: 0)take(int, default: 20, máx: 100)
Response (200 OK):
Similar ao GET /donations
Obtém detalhes de uma doação específica.
Response (200 OK):
{
"id": 1,
"donationType": "monetary",
"donationStatus": "pending",
"monetaryAmount": 150.50,
"monetaryCurrency": "BRL",
"materialDescription": null,
"materialQuantity": null,
"proofOfPaymentUrl": "/uploads/payment-proofs/proof-12345.jpg",
"createdAt": "2024-01-15T10:30:00Z",
"updatedAt": "2024-01-15T10:30:00Z",
"verifiedAt": null,
"ong": { ... },
"donor": { ... }
}Atualiza uma doação.
Permissões:
- Doador: Pode atualizar descrição/quantidade de materiais pendentes, cancelar
- ONG: Pode marcar como COMPLETED ou CANCELED
- Doações monetárias: Apenas podem ser canceladas ou aceitas
Request Body:
{
"donationStatus": "completed",
"materialDescription": "Alimentos atualizados",
"materialQuantity": 15
}Response (200 OK): Retorna doação atualizada
Validações:
- Doações COMPLETED/CANCELED não podem ser alteradas
- Cada role tem permissões específicas
Aceita uma doação (marca como COMPLETED).
Response (200 OK): Retorna doação com status atualizado
Rejeita uma doação (marca como CANCELED).
Response (200 OK): Retorna doação com status atualizado
Cancela uma doação (apenas doadores).
Response (204 No Content)
Cria uma nova categoria.
Request Body:
{
"name": "Educação"
}Response (201 Created):
{
"id": 1,
"name": "Educação",
"createdAt": "2024-01-15T10:30:00Z",
"updatedAt": "2024-01-15T10:30:00Z"
}Erros Possíveis:
409 Conflict- Categoria com este nome já existe
Lista todas as categorias (paginado, alfabético).
Query Parameters:
skip(int, default: 0)take(int, default: 10, máx: 100)
Response (200 OK):
{
"data": [
{
"id": 1,
"name": "Assistência Social",
"createdAt": "2024-01-01T08:00:00Z",
"updatedAt": "2024-01-01T08:00:00Z"
},
{
"id": 2,
"name": "Cultura e Arte",
"createdAt": "2024-01-01T08:00:00Z",
"updatedAt": "2024-01-01T08:00:00Z"
}
],
"pagination": {
"skip": 0,
"take": 10,
"total": 12,
"pages": 2
}
}Obtém uma categoria específica.
Response (200 OK):
{
"id": 1,
"name": "Educação",
"createdAt": "2024-01-01T08:00:00Z",
"updatedAt": "2024-01-01T08:00:00Z"
}Atualiza uma categoria.
Request Body:
{
"name": "Educação e Capacitação"
}Response (200 OK): Categoria atualizada
Deleta uma categoria.
Response (204 No Content)
Cria ou atualiza a avaliação de uma ONG (apenas doadores).
Pré-requisito: Doador deve ter doado para a ONG
Request Body:
{
"score": 5,
"comment": "Excelente transparência e impacto"
}Response (201 Created / 200 Updated):
{
"id": 1,
"score": 5,
"comment": "Excelente transparência e impacto",
"createdAt": "2024-01-15T10:30:00Z",
"updatedAt": "2024-01-15T10:30:00Z",
"ongId": 2,
"donorId": 1
}Validações:
- Score entre 1 e 5
- Doador deve ter realizado doação para a ONG
Erros Possíveis:
403 Forbidden- Doador nunca doou para esta ONG404 Not Found- ONG não encontrada
Lista todas as avaliações de uma ONG.
Query Parameters:
skip(int, default: 0)take(int, default: 20, máx: 100)
Response (200 OK):
[
{
"score": 5,
"comment": "Excelente organização",
"createdAt": "2024-01-15T10:30:00Z",
"donor": {
"user": {
"name": "João Silva"
}
}
}
]Cria um novo endereço. Geocodifica automaticamente se não houver coordenadas.
Request Body:
{
"street": "Rua das Flores",
"number": "123",
"complement": "Apartamento 42",
"neighborhood": "Centro",
"city": "São Paulo",
"state": "SP",
"zipCode": "01234-567",
"country": "Brasil",
"latitude": -23.5505,
"longitude": -46.6333
}Response (201 Created):
{
"id": 1,
"street": "Rua das Flores",
"number": "123",
"complement": "Apartamento 42",
"neighborhood": "Centro",
"city": "São Paulo",
"state": "SP",
"zipCode": "01234-567",
"country": "Brasil",
"latitude": -23.5505,
"longitude": -46.6333,
"donorId": 1,
"ongId": null,
"createdAt": "2024-01-15T10:30:00Z",
"updatedAt": "2024-01-15T10:30:00Z"
}Lista todos os endereços.
Response (200 OK): Array de endereços
Obtém um endereço específico.
Response (200 OK): Detalhes do endereço
Atualiza um endereço e regeocodifica se necessário.
Request Body:
{
"city": "Rio de Janeiro"
}Response (200 OK): Endereço atualizado
Deleta um endereço.
Response (204 No Content)
Geocodifica um endereço (retorna apenas coordenadas).
Request Body:
{
"street": "Rua das Flores",
"number": "123",
"neighborhood": "Centro",
"city": "São Paulo",
"state": "SP",
"zipCode": "01234-567"
}Response (200 OK):
{
"latitude": -23.5505,
"longitude": -46.6333
}Cria ou atualiza a conta bancária da ONG autenticada.
Request Body:
{
"bankName": "Banco do Brasil",
"agencyNumber": "1234-5",
"accountNumber": "12345-6",
"accountType": "Corrente",
"pixKey": "contato@ongesperanca.com.br"
}Response (201 Created / 200 Updated):
{
"id": 1,
"bankName": "Banco do Brasil",
"agencyNumber": "1234-5",
"accountNumber": "12345-6",
"accountType": "Corrente",
"pixKey": "contato@ongesperanca.com.br",
"createdAt": "2024-01-15T10:30:00Z",
"updatedAt": "2024-01-15T10:30:00Z",
"ongProfileId": 1
}Lista todas as contas bancárias da ONG autenticada.
Response (200 OK): Array de contas bancárias
Retorna dados seguros da(s) conta(s) bancária(s) de uma ONG (sem dados sensíveis).
Response (200 OK):
[
{
"bankName": "Banco do Brasil",
"agencyNumber": "1234-5",
"accountNumber": "12345-6",
"accountType": "Corrente",
"pixKey": "contato@ongesperanca.com.br"
}
]Atualiza a conta bancária da ONG autenticada.
Request Body:
{
"pixKey": "novo.pix@ongesperanca.com.br"
}Response (200 OK): Conta bancária atualizada
Remove a conta bancária da ONG autenticada.
Response (204 No Content)
Cria um item na lista de desejos da ONG.
Request Body:
{
"description": "Notebooks para aula de informática",
"quantity": 10
}Response (201 Created):
{
"id": 1,
"ongId": 2,
"description": "Notebooks para aula de informática",
"quantity": 10,
"createdAt": "2024-01-15T10:30:00Z",
"updatedAt": "2024-01-15T10:30:00Z"
}Nota: O ongId na URL é ignorado na criação; usa-se o ID do usuário autenticado
Lista todos os itens da wishlist de uma ONG.
Response (200 OK):
[
{
"id": 1,
"ongId": 2,
"description": "Notebooks para aula de informática",
"quantity": 10,
"createdAt": "2024-01-15T10:30:00Z",
"updatedAt": "2024-01-15T10:30:00Z"
}
]Obtém um item específico da wishlist.
Response (200 OK): Item detalhado
Atualiza um item da wishlist.
Request Body:
{
"description": "Notebooks (i7 ou superior)",
"quantity": 15
}Response (200 OK): Item atualizado
Validação:
- Apenas a ONG proprietária pode atualizar
Remove um item da wishlist.
Response (204 No Content)
Busca ONGs verificadas organizadas em seções com ranking inteligente.
Query Parameters:
categoryIds(string, opcional) - IDs separados por vírgula:1,2,3searchTerm(string, opcional) - Termo de buscalimit(int, optional, default: 10) - Quantidade por seçãooffset(int, optional, default: 0) - Paginação offset-based
Response sem searchTerm (200 OK):
[
{
"title": "Melhor Avaliadas",
"type": "topRated",
"items": [
{
"id": 2,
"name": "ONG Esperança",
"avatarUrl": "/uploads/profiles/ong-esperanca.jpg",
"bannerUrl": "/uploads/profiles/ong-esperanca-banner.jpg",
"categories": [
{
"id": 1,
"name": "Educação"
}
],
"createdAt": "2024-01-10T14:00:00Z",
"averageRating": 4.8,
"numberOfRatings": 50
}
]
},
{
"title": "Mais Recentes",
"type": "newest",
"items": [...]
},
{
"title": "Próximas a Você",
"type": "nearby",
"items": [...]
}
]Response com searchTerm (200 OK):
{
"title": "Resultados para \"educação\"",
"type": "search",
"items": [...]
}Seções Retornadas (sem busca):
- Melhor Avaliadas - Ordenadas por average rating descendente
- Mais Recentes - Ordenadas por data descendente
- Próximas a Você - Dentro de 10km da localização do usuário
- Mais Antigas - Ordenadas por data ascendente
- Mais Doações Recebidas - Por quantidade de doações
- Menos Doações Recebidas - Por quantidade de doações (ascendente)
Ranking Inteligente:
- Quando
categoryIdsé fornecido, ONGs com mais correspondências aparecem primeiro - Campo
matchCountmostra quantas categorias correspondem
Cria um novo administrador.
Request Body:
{
"name": "Novo Admin",
"email": "admin@doecerto.com",
"password": "senha123"
}Response (201 Created):
{
"userId": 3,
"user": {
"id": 3,
"name": "Novo Admin",
"email": "admin@doecerto.com"
}
}Deleta um administrador.
Response (204 No Content)
Obtém dados do admin autenticado.
Response (200 OK): Dados do admin
Obtém estatísticas do admin autenticado.
Response (200 OK):
{
"adminId": 3,
"adminName": "Novo Admin",
"totalVerifications": 25,
"approved": 20,
"rejected": 5
}Obtém dados de um admin específico.
Response (200 OK): Dados do admin
Obtém estatísticas de um admin específico.
Response (200 OK):
Similar ao GET /admins/me/stats
Lista ONGs pendentes de verificação.
Response (200 OK):
[
{
"userId": 5,
"cnpj": "11.222.333/0001-44",
"verificationStatus": "pending",
"verifiedAt": null,
"rejectionReason": null,
"contactNumber": "(11) 98765-4321",
"name": "ONG Nova",
"email": "contato@ongnova.com",
"verifiedBy": null
}
]Lista ONGs verificadas/aprovadas.
Response (200 OK):
Similar ao anterior, com dados de verifiedBy
Lista ONGs rejeitadas.
Response (200 OK):
Similar, com rejectionReason preenchido
Aprova uma ONG (marca como verified).
Response (200 OK):
ONG atualizada com status verified
Rejeita uma ONG (marca como rejected).
Request Body:
{
"reason": "Documentação incompleta"
}Response (200 OK):
ONG atualizada com status rejected e rejectionReason
Obtém métricas gerais do dashboard.
Response (200 OK):
{
"topOngsByDonationCount": [
{
"id": 2,
"name": "ONG Esperança",
"email": "contato@ongesperanca.com",
"value": 150,
"category": "Educação"
}
],
"topDonorsByFrequency": [
{
"id": 1,
"name": "João Silva",
"email": "joao@example.com",
"value": 45
}
],
"topPositiveRatings": [...],
"topNegativeRatings": [...],
"categoriesStats": [
{
"name": "Educação",
"count": 35,
"percentage": 30
}
],
"generalStats": {
"totalOngs": 120,
"totalDonors": 5000
}
}| Código | Significado |
|---|---|
| 200 | OK - Requisição bem-sucedida |
| 201 | Created - Recurso criado com sucesso |
| 204 | No Content - Operação bem-sucedida sem retorno |
| Código | Significado | Causas Comuns |
|---|---|---|
| 400 | Bad Request | Dados inválidos, validação falhou, ONG não verificada |
| 401 | Unauthorized | JWT inválido ou expirado, credenciais incorretas |
| 403 | Forbidden | Permissão insuficiente, tentativa de acessar recurso de outro usuário |
| 404 | Not Found | Recurso não encontrado |
| 409 | Conflict | Email/CPF/CNPJ duplicado, categoria já existe |
| Código | Significado |
|---|---|
| 500 | Internal Server Error - Erro não tratado no servidor |
curl -X POST http://localhost:3001/auth/register/donor \
-H "Content-Type: application/json" \
-d '{
"name": "João Silva",
"email": "joao@example.com",
"password": "senha123",
"cpf": "123.456.789-00"
}'curl -X POST http://localhost:3001/auth/login \
-H "Content-Type: application/json" \
-d '{
"email": "joao@example.com",
"password": "senha123"
}' \
-c cookies.txtcurl -X POST http://localhost:3001/donations \
-H "Content-Type: application/json" \
-b cookies.txt \
-d '{
"ongId": 2,
"donationType": "monetary",
"monetaryAmount": 150.50,
"monetaryCurrency": "BRL"
}'curl -X POST http://localhost:3001/donations \
-H "Content-Type: application/json" \
-b cookies.txt \
-d '{
"ongId": 2,
"donationType": "material",
"materialDescription": "Alimentos não-perecíveis",
"materialQuantity": 10
}'curl -X POST http://localhost:3001/donations \
-F "proofFile=@comprovante.jpg" \
-F 'createDonationDto={
"ongId": 2,
"donationType": "monetary",
"monetaryAmount": 100.00,
"monetaryCurrency": "BRL"
};type=application/json' \
-b cookies.txtcurl -X GET "http://localhost:3001/donations/me/sent?skip=0&take=20" \
-b cookies.txtcurl -X PATCH http://localhost:3001/donations/1/accept \
-b cookies.txtcurl -X POST http://localhost:3001/donors/me/profile \
-F "file=@avatar.jpg" \
-F "description=Apaixonado por causas sociais" \
-F "contactNumber=(11) 9 9999-8888" \
-b cookies.txtcurl -X POST http://localhost:3001/ongs/me/profile \
-F "avatar=@avatar.jpg" \
-F "banner=@banner.jpg" \
-F "description=ONG dedicada à educação" \
-F "yearsOfOperation=12" \
-F "website=https://ong.com.br" \
-F "website=https://parceiro.ong.com.br" \
-F "contactNumber=(11) 98765-4321" \
-F "categoryIds=1" \
-F "categoryIds=2" \
-F 'bankAccount={"bankName":"Banco do Brasil","agencyNumber":"1234-5","accountNumber":"12345-6","accountType":"Corrente","pixKey":"contato@ong.com.br"};type=application/json' \
-b cookies.txtcurl -X GET http://localhost:3001/ongs/2/profilecurl -X POST http://localhost:3001/ongs/2/wishlist-items \
-H "Content-Type: application/json" \
-b cookies.txt \
-d '{
"description": "Notebooks para aula de informática",
"quantity": 10
}'curl -X GET http://localhost:3001/ongs/2/wishlist-itemscurl -X GET "http://localhost:3001/categories?skip=0&take=10"curl -X POST http://localhost:3001/ongs/2/ratings \
-H "Content-Type: application/json" \
-b cookies.txt \
-d '{
"score": 5,
"comment": "Excelente transparência"
}'curl -X GET "http://localhost:3001/ongs/2/ratings?skip=0&take=10"curl -X POST http://localhost:3001/addresses \
-H "Content-Type: application/json" \
-b cookies.txt \
-d '{
"street": "Rua das Flores",
"number": "123",
"neighborhood": "Centro",
"city": "São Paulo",
"state": "SP",
"zipCode": "01234-567"
}'curl -X POST http://localhost:3001/addresses/geocode \
-H "Content-Type: application/json" \
-d '{
"street": "Rua das Flores",
"number": "123",
"neighborhood": "Centro",
"city": "São Paulo",
"state": "SP"
}'curl -X GET http://localhost:3001/catalog \
-b cookies.txtcurl -X GET "http://localhost:3001/catalog?categoryIds=1,2,3" \
-b cookies.txtcurl -X GET "http://localhost:3001/catalog?searchTerm=educacao" \
-b cookies.txtcurl -X GET http://localhost:3001/ongs/nearby \
-b cookies.txtcurl -X GET http://localhost:3001/admins/ongs/status/pending \
-b cookies.txtcurl -X PATCH http://localhost:3001/admins/ongs/2/verification/approve \
-b cookies.txtcurl -X PATCH http://localhost:3001/admins/ongs/2/verification/reject \
-H "Content-Type: application/json" \
-b cookies.txt \
-d '{"reason": "Documentação incompleta"}'curl -X GET http://localhost:3001/admins/metrics \
-b cookies.txtcurl -X POST http://localhost:3001/ongs/bank-account/me \
-H "Content-Type: application/json" \
-b cookies.txt \
-d '{
"bankName": "Banco do Brasil",
"agencyNumber": "1234-5",
"accountNumber": "12345-6",
"accountType": "Corrente",
"pixKey": "contato@ong.com.br"
}'curl -X GET http://localhost:3001/ongs/bank-account/2O token JWT é armazenado automaticamente em cookie access_token após login/registro. Para requisições subsequentes, o token é enviado automaticamente.
Você pode também enviar manualmente via header:
curl -X GET http://localhost:3001/users/me \
-H "Authorization: Bearer SEU_TOKEN_JWT"Para requisições com upload, use multipart/form-data:
- Avatar/Banner: JPG, PNG, WebP (máx 5-10MB)
- Comprovante Pagamento: JPG, PNG, PDF (máx 5MB)
- Imagens são processadas automaticamente (redimensionadas, comprimidas)
Todos os endpoints de listagem suportam:
skip: Registros a pular (padrão: 0)take: Quantidade a retornar (padrão: 20, máx: 100)
- Sem rate limiting implementado atualmente
- Recomendado para produção: 100 requisições por minuto por IP
Todos os erros retornam JSON:
{
"statusCode": 400,
"message": "Descrição do erro"
}Última atualização: 13 de fevereiro de 2026
Versão: 1.2.0
Mantém compatibilidade com versões anteriores: Sim ✅