- Framework: Yii2.0
- Formato de Resposta: JSON
- Autenticação: Bearer Token / API Key
- Base URL:
https://api.veigest.com/v1 - Cabeçalhos Obrigatórios:
Content-Type: application/jsonAuthorization: Bearer {token}Accept: application/json
| HTTP Verb | Endpoint | Descrição | Parâmetros | Pedido | Resposta (JSON) |
|---|---|---|---|---|---|
| GET | /companies |
Listar todas as empresas | page, limit, sort, filter |
- | {"data": [{"id": 1, "nome": "VeiGest Demo", "nif": "999999990", "email": "admin@veigest.com", "estado": "ativa", "plano": "enterprise"}], "pagination": {...}} |
| GET | /companies/{id} |
Obter empresa específica | - | - | {"data": {"id": 1, "nome": "VeiGest Demo", "nif": "999999990", "email": "admin@veigest.com", "estado": "ativa", "plano": "enterprise", "configuracoes": {...}}} |
| POST | /companies |
Criar nova empresa | - | {"nome": "Nova Empresa", "nif": "123456789", "email": "empresa@email.com", "plano": "basico"} |
{"data": {"id": 2, "nome": "Nova Empresa", "nif": "123456789", "email": "empresa@email.com", "estado": "ativa", "plano": "basico"}} |
| PUT | /companies/{id} |
Atualizar empresa completa | - | {"nome": "Empresa Atualizada", "email": "novo@email.com", "plano": "profissional"} |
{"data": {"id": 1, "nome": "Empresa Atualizada", "email": "novo@email.com", "plano": "profissional"}} |
| PATCH | /companies/{id} |
Atualizar campos específicos | - | {"estado": "suspensa"} |
{"data": {"id": 1, "estado": "suspensa"}} |
| DELETE | /companies/{id} |
Eliminar empresa | - | - | {"success": true, "message": "Empresa eliminada com sucesso"} |
| HTTP Verb | Endpoint | Descrição | Parâmetros | Pedido | Resposta (JSON) |
|---|---|---|---|---|---|
| GET | /users |
Listar utilizadores | company_id, page, limit, sort, filter |
- | {"data": [{"id": 1, "nome": "João Silva", "email": "joao@empresa.com", "estado": "ativo", "numero_carta": "12345", "validade_carta": "2025-12-31"}]} |
| GET | /users/{id} |
Obter utilizador específico | - | - | {"data": {"id": 1, "company_id": 1, "nome": "João Silva", "email": "joao@empresa.com", "telefone": "912345678", "estado": "ativo", "numero_carta": "12345", "validade_carta": "2025-12-31"}} |
| POST | /users |
Criar novo utilizador | - | {"company_id": 1, "nome": "Maria Santos", "email": "maria@empresa.com", "senha": "password123", "telefone": "913456789", "numero_carta": "54321", "validade_carta": "2026-06-30"} |
{"data": {"id": 2, "nome": "Maria Santos", "email": "maria@empresa.com", "estado": "ativo"}} |
| PUT | /users/{id} |
Atualizar utilizador completo | - | {"nome": "Maria Santos Silva", "telefone": "914567890", "validade_carta": "2026-12-31"} |
{"data": {"id": 2, "nome": "Maria Santos Silva", "telefone": "914567890"}} |
| PATCH | /users/{id} |
Atualizar campos específicos | - | {"estado": "inativo"} |
{"data": {"id": 2, "estado": "inativo"}} |
| DELETE | /users/{id} |
Eliminar utilizador | - | - | {"success": true, "message": "Utilizador eliminado com sucesso"} |
| POST | /users/{id}/reset-password |
Reset de password | - | {"new_password": "newpass123"} |
{"success": true, "message": "Password alterada com sucesso"} |
| HTTP Verb | Endpoint | Descrição | Parâmetros | Pedido | Resposta (JSON) |
|---|---|---|---|---|---|
| GET | /vehicles |
Listar veículos | company_id, estado, page, limit, sort |
- | {"data": [{"id": 1, "matricula": "AA-00-AA", "marca": "Toyota", "modelo": "Corolla", "ano": 2020, "estado": "ativo", "condutor_id": 1}]} |
| GET | /vehicles/{id} |
Obter veículo específico | - | - | {"data": {"id": 1, "company_id": 1, "matricula": "AA-00-AA", "marca": "Toyota", "modelo": "Corolla", "ano": 2020, "tipo_combustivel": "gasolina", "quilometragem": 50000, "estado": "ativo", "condutor_id": 1}} |
| POST | /vehicles |
Criar novo veículo | - | {"company_id": 1, "matricula": "BB-11-BB", "marca": "Ford", "modelo": "Focus", "ano": 2021, "tipo_combustivel": "diesel"} |
{"data": {"id": 2, "matricula": "BB-11-BB", "marca": "Ford", "modelo": "Focus", "estado": "ativo"}} |
| PUT | /vehicles/{id} |
Atualizar veículo completo | - | {"marca": "Ford", "modelo": "Fiesta", "quilometragem": 55000, "condutor_id": 2} |
{"data": {"id": 1, "marca": "Ford", "modelo": "Fiesta", "quilometragem": 55000}} |
| PATCH | /vehicles/{id} |
Atualizar campos específicos | - | {"estado": "manutencao", "quilometragem": 56000} |
{"data": {"id": 1, "estado": "manutencao", "quilometragem": 56000}} |
| DELETE | /vehicles/{id} |
Eliminar veículo | - | - | {"success": true, "message": "Veículo eliminado com sucesso"} |
| POST | /vehicles/{id}/assign-driver |
Atribuir condutor | - | {"condutor_id": 3} |
{"success": true, "message": "Condutor atribuído com sucesso"} |
| POST | /vehicles/{id}/unassign-driver |
Remover condutor | - | - | {"success": true, "message": "Condutor removido com sucesso"} |
| HTTP Verb | Endpoint | Descrição | Parâmetros | Pedido | Resposta (JSON) |
|---|---|---|---|---|---|
| GET | /maintenances |
Listar manutenções | vehicle_id, data_inicio, data_fim, page, limit |
- | {"data": [{"id": 1, "vehicle_id": 1, "tipo": "Revisão", "data": "2025-10-15", "custo": 150.00, "oficina": "AutoRep"}]} |
| GET | /maintenances/{id} |
Obter manutenção específica | - | - | {"data": {"id": 1, "company_id": 1, "vehicle_id": 1, "tipo": "Revisão", "descricao": "Troca de óleo e filtros", "data": "2025-10-15", "custo": 150.00, "km_registro": 50000, "proxima_data": "2026-04-15", "oficina": "AutoRep"}} |
| POST | /maintenances |
Criar nova manutenção | - | {"company_id": 1, "vehicle_id": 1, "tipo": "Pneus", "descricao": "Troca de pneus dianteiros", "data": "2025-11-01", "custo": 200.00, "km_registro": 52000, "oficina": "PneuMax"} |
{"data": {"id": 2, "vehicle_id": 1, "tipo": "Pneus", "data": "2025-11-01", "custo": 200.00}} |
| PUT | /maintenances/{id} |
Atualizar manutenção completa | - | {"custo": 180.00, "proxima_data": "2026-05-01", "oficina": "AutoRep Premium"} |
{"data": {"id": 1, "custo": 180.00, "proxima_data": "2026-05-01"}} |
| PATCH | /maintenances/{id} |
Atualizar campos específicos | - | {"custo": 175.00} |
{"data": {"id": 1, "custo": 175.00}} |
| DELETE | /maintenances/{id} |
Eliminar manutenção | - | - | {"success": true, "message": "Manutenção eliminada com sucesso"} |
| HTTP Verb | Endpoint | Descrição | Parâmetros | Pedido | Resposta (JSON) |
|---|---|---|---|---|---|
| GET | /documents |
Listar documentos | vehicle_id, driver_id, tipo, status, page, limit |
- | {"data": [{"id": 1, "tipo": "seguro", "data_validade": "2025-12-31", "status": "valido", "vehicle": {"matricula": "AA-00-AA"}}]} |
| GET | /documents/{id} |
Obter documento específico | - | - | {"data": {"id": 1, "company_id": 1, "file_id": 1, "vehicle_id": 1, "tipo": "seguro", "data_validade": "2025-12-31", "status": "valido", "notas": "Seguro contra terceiros"}} |
| POST | /documents |
Criar novo documento | - | {"company_id": 1, "file_id": 2, "vehicle_id": 1, "tipo": "inspecao", "data_validade": "2026-06-30", "notas": "Inspeção periódica"} |
{"data": {"id": 2, "tipo": "inspecao", "data_validade": "2026-06-30", "status": "valido"}} |
| PUT | /documents/{id} |
Atualizar documento completo | - | {"data_validade": "2026-12-31", "notas": "Renovado antecipadamente"} |
{"data": {"id": 1, "data_validade": "2026-12-31"}} |
| PATCH | /documents/{id} |
Atualizar campos específicos | - | {"status": "expirado"} |
{"data": {"id": 1, "status": "expirado"}} |
| DELETE | /documents/{id} |
Eliminar documento | - | - | {"success": true, "message": "Documento eliminado com sucesso"} |
| GET | /documents/expiring |
Documentos a expirar | dias (default: 30) |
- | {"data": [{"id": 1, "tipo": "seguro", "dias_para_vencimento": 15, "entidade": "AA-00-AA"}]} |
| HTTP Verb | Endpoint | Descrição | Parâmetros | Pedido | Resposta (JSON) |
|---|---|---|---|---|---|
| GET | /files |
Listar ficheiros | company_id, page, limit |
- | {"data": [{"id": 1, "nome_original": "seguro.pdf", "tamanho": 1024000, "uploaded_by": 1, "created_at": "2025-11-08T10:00:00Z"}]} |
| GET | /files/{id} |
Obter ficheiro específico | - | - | {"data": {"id": 1, "company_id": 1, "nome_original": "seguro.pdf", "tamanho": 1024000, "caminho": "/uploads/2025/11/seguro_123.pdf", "uploaded_by": 1}} |
| POST | /files |
Upload de ficheiro | - | multipart/form-data: file, company_id |
{"data": {"id": 2, "nome_original": "carta.pdf", "tamanho": 512000, "caminho": "/uploads/2025/11/carta_456.pdf"}} |
| GET | /files/{id}/download |
Download de ficheiro | - | - | Ficheiro binário |
| DELETE | /files/{id} |
Eliminar ficheiro | - | - | {"success": true, "message": "Ficheiro eliminado com sucesso"} |
| HTTP Verb | Endpoint | Descrição | Parâmetros | Pedido | Resposta (JSON) |
|---|---|---|---|---|---|
| GET | /fuel-logs |
Listar registos de combustível | vehicle_id, driver_id, data_inicio, data_fim, page, limit |
- | {"data": [{"id": 1, "vehicle_id": 1, "data": "2025-11-01", "litros": 50.00, "valor": 85.00, "preco_litro": 1.70, "km_atual": 52000}]} |
| GET | /fuel-logs/{id} |
Obter registo específico | - | - | {"data": {"id": 1, "company_id": 1, "vehicle_id": 1, "driver_id": 1, "data": "2025-11-01", "litros": 50.00, "valor": 85.00, "preco_litro": 1.70, "km_atual": 52000, "notas": "Posto BP"}} |
| POST | /fuel-logs |
Criar novo registo | - | {"company_id": 1, "vehicle_id": 1, "driver_id": 1, "data": "2025-11-08", "litros": 45.50, "valor": 78.90, "km_atual": 52500, "notas": "Posto Galp"} |
{"data": {"id": 2, "vehicle_id": 1, "data": "2025-11-08", "litros": 45.50, "valor": 78.90, "preco_litro": 1.73}} |
| PUT | /fuel-logs/{id} |
Atualizar registo completo | - | {"litros": 46.00, "valor": 79.20, "km_atual": 52550} |
{"data": {"id": 1, "litros": 46.00, "valor": 79.20, "preco_litro": 1.72}} |
| PATCH | /fuel-logs/{id} |
Atualizar campos específicos | - | {"notas": "Posto Repsol - desconto"} |
{"data": {"id": 1, "notas": "Posto Repsol - desconto"}} |
| DELETE | /fuel-logs/{id} |
Eliminar registo | - | - | {"success": true, "message": "Registo de combustível eliminado"} |
| HTTP Verb | Endpoint | Descrição | Parâmetros | Pedido | Resposta (JSON) |
|---|---|---|---|---|---|
| GET | /routes |
Listar rotas | vehicle_id, driver_id, status, data_inicio, data_fim, page, limit |
- | {"data": [{"id": 1, "vehicle_id": 1, "driver_id": 1, "inicio": "2025-11-08T09:00:00Z", "fim": "2025-11-08T17:30:00Z", "origem": "Lisboa", "destino": "Porto", "status": "concluida"}]} |
| GET | /routes/{id} |
Obter rota específica | - | - | {"data": {"id": 1, "company_id": 1, "vehicle_id": 1, "driver_id": 1, "inicio": "2025-11-08T09:00:00Z", "fim": "2025-11-08T17:30:00Z", "km_inicial": 50000, "km_final": 50320, "origem": "Lisboa", "destino": "Porto", "distancia_km": 320.5, "status": "concluida"}} |
| POST | /routes |
Iniciar nova rota | - | {"company_id": 1, "vehicle_id": 1, "driver_id": 1, "km_inicial": 52500, "origem": "Lisboa", "destino": "Coimbra"} |
{"data": {"id": 2, "vehicle_id": 1, "driver_id": 1, "inicio": "2025-11-08T14:00:00Z", "status": "em_andamento"}} |
| PATCH | /routes/{id}/finish |
Finalizar rota | - | {"km_final": 52650, "notas": "Viagem sem incidentes"} |
{"data": {"id": 2, "fim": "2025-11-08T16:30:00Z", "km_final": 52650, "status": "concluida"}} |
| PATCH | /routes/{id}/cancel |
Cancelar rota | - | {"notas": "Cancelada por avaria"} |
{"data": {"id": 2, "status": "cancelada"}} |
| PUT | /routes/{id} |
Atualizar rota completa | - | {"origem": "Lisboa Centro", "destino": "Coimbra Sul", "notas": "Rota atualizada"} |
{"data": {"id": 2, "origem": "Lisboa Centro", "destino": "Coimbra Sul"}} |
| DELETE | /routes/{id} |
Eliminar rota | - | - | {"success": true, "message": "Rota eliminada com sucesso"} |
| HTTP Verb | Endpoint | Descrição | Parâmetros | Pedido | Resposta (JSON) |
|---|---|---|---|---|---|
| GET | /gps-entries |
Listar pontos GPS | route_id, timestamp_inicio, timestamp_fim, page, limit |
- | {"data": [{"id": 1, "route_id": 1, "latitude": 38.7169, "longitude": -9.1395, "timestamp": "2025-11-08T09:15:00Z", "velocidade": 50.5}]} |
| GET | /routes/{route_id}/gps-entries |
Pontos GPS de uma rota | page, limit |
- | {"data": [{"id": 1, "latitude": 38.7169, "longitude": -9.1395, "timestamp": "2025-11-08T09:15:00Z", "velocidade": 50.5, "altitude": 125.3}]} |
| POST | /gps-entries |
Criar ponto GPS | - | {"route_id": 2, "latitude": 38.7169, "longitude": -9.1395, "velocidade": 60.0, "altitude": 130.0, "precisao": 5.0} |
{"data": {"id": 3, "route_id": 2, "latitude": 38.7169, "longitude": -9.1395, "timestamp": "2025-11-08T14:30:00Z"}} |
| POST | /gps-entries/batch |
Criar múltiplos pontos GPS | - | {"route_id": 2, "entries": [{"latitude": 38.7169, "longitude": -9.1395, "velocidade": 60.0}, {"latitude": 38.7269, "longitude": -9.1295, "velocidade": 65.0}]} |
{"success": true, "count": 2, "message": "Pontos GPS registados"} |
| DELETE | /gps-entries/{id} |
Eliminar ponto GPS | - | - | {"success": true, "message": "Ponto GPS eliminado"} |
| HTTP Verb | Endpoint | Descrição | Parâmetros | Pedido | Resposta (JSON) |
|---|---|---|---|---|---|
| GET | /alerts |
Listar alertas | tipo, status, prioridade, page, limit |
- | {"data": [{"id": 1, "tipo": "documento", "titulo": "Seguro a expirar", "prioridade": "alta", "status": "ativo", "created_at": "2025-11-08T10:00:00Z"}]} |
| GET | /alerts/{id} |
Obter alerta específico | - | - | {"data": {"id": 1, "company_id": 1, "tipo": "documento", "titulo": "Seguro a expirar", "descricao": "O seguro do veículo AA-00-AA expira em 15 dias", "prioridade": "alta", "status": "ativo", "detalhes": {"vehicle_id": 1, "document_id": 1}}} |
| POST | /alerts |
Criar novo alerta | - | {"company_id": 1, "tipo": "manutencao", "titulo": "Revisão em atraso", "descricao": "Veículo necessita de revisão", "prioridade": "media", "detalhes": {"vehicle_id": 1}} |
{"data": {"id": 2, "tipo": "manutencao", "titulo": "Revisão em atraso", "status": "ativo"}} |
| PATCH | /alerts/{id}/resolve |
Resolver alerta | - | {"notas": "Documento renovado"} |
{"data": {"id": 1, "status": "resolvido", "resolvido_em": "2025-11-08T15:30:00Z"}} |
| PATCH | /alerts/{id}/ignore |
Ignorar alerta | - | {"notas": "Falso positivo"} |
{"data": {"id": 1, "status": "ignorado"}} |
| DELETE | /alerts/{id} |
Eliminar alerta | - | - | {"success": true, "message": "Alerta eliminado com sucesso"} |
| HTTP Verb | Endpoint | Descrição | Parâmetros | Pedido | Resposta (JSON) |
|---|---|---|---|---|---|
| GET | /activity-logs |
Listar logs de atividade | user_id, entidade, entidade_id, data_inicio, data_fim, page, limit |
- | {"data": [{"id": 1, "user_id": 1, "acao": "vehicle.create", "entidade": "vehicle", "entidade_id": 1, "ip": "192.168.1.100", "created_at": "2025-11-08T10:00:00Z"}]} |
| GET | /activity-logs/{id} |
Obter log específico | - | - | {"data": {"id": 1, "company_id": 1, "user_id": 1, "acao": "vehicle.create", "entidade": "vehicle", "entidade_id": 1, "detalhes": {"matricula": "AA-00-AA", "marca": "Toyota"}, "ip": "192.168.1.100"}} |
| POST | /activity-logs |
Criar log de atividade | - | {"company_id": 1, "user_id": 1, "acao": "document.upload", "entidade": "document", "entidade_id": 2, "detalhes": {"tipo": "seguro"}, "ip": "192.168.1.101"} |
{"data": {"id": 2, "acao": "document.upload", "created_at": "2025-11-08T15:30:00Z"}} |
| HTTP Verb | Endpoint | Descrição | Parâmetros | Pedido | Resposta (JSON) |
|---|---|---|---|---|---|
| GET | /reports/company-stats |
Estatísticas da empresa | company_id |
- | {"data": {"total_users": 15, "total_vehicles": 8, "total_drivers": 12, "total_storage_bytes": 50000000}} |
| GET | /reports/vehicle-costs |
Custos por veículo | vehicle_id, data_inicio, data_fim |
- | {"data": [{"vehicle_id": 1, "matricula": "AA-00-AA", "total_maintenance": 500.00, "total_fuel": 1200.00, "total_costs": 1700.00}]} |
| GET | /reports/fuel-consumption |
Consumo de combustível | vehicle_id, periodo |
- | {"data": {"periodo": "2025-11", "total_litros": 150.5, "total_valor": 255.85, "media_preco_litro": 1.70, "consumo_medio": 7.5}} |
| GET | /reports/maintenance-schedule |
Cronograma de manutenções | data_inicio, data_fim |
- | {"data": [{"vehicle_id": 1, "matricula": "AA-00-AA", "proximo_servico": "2025-12-15", "tipo": "Revisão", "dias_restantes": 37}]} |
| GET | /reports/driver-performance |
Performance dos condutores | driver_id, periodo |
- | {"data": {"driver_id": 1, "nome": "João Silva", "km_percorridos": 2500, "rotas_concluidas": 15, "consumo_medio": 7.2, "score": 85}} |
| HTTP Verb | Endpoint | Descrição | Parâmetros | Pedido | Resposta (JSON) |
|---|---|---|---|---|---|
| POST | /auth/login |
Login do utilizador | - | {"email": "user@empresa.com", "password": "senha123"} |
{"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...", "token_type": "Bearer", "expires_in": 3600, "user": {...}} |
| POST | /auth/refresh |
Renovar token | - | {"refresh_token": "refresh_token_here"} |
{"access_token": "new_token_here", "expires_in": 3600} |
| POST | /auth/logout |
Logout do utilizador | - | - | {"success": true, "message": "Logout realizado com sucesso"} |
| GET | /auth/me |
Dados do utilizador autenticado | - | - | {"data": {"id": 1, "nome": "João Silva", "email": "joao@empresa.com", "roles": ["gestor"], "permissions": [...]}} |
- 200 OK: Pedido bem-sucedido
- 201 Created: Recurso criado com sucesso
- 204 No Content: Pedido bem-sucedido sem conteúdo de resposta
- 400 Bad Request: Dados do pedido inválidos
- 401 Unauthorized: Não autenticado
- 403 Forbidden: Não autorizado (sem permissões)
- 404 Not Found: Recurso não encontrado
- 422 Unprocessable Entity: Erro de validação
- 500 Internal Server Error: Erro interno do servidor
{
"error": {
"code": 422,
"message": "Validation failed",
"details": [
{
"field": "email",
"message": "Email is required"
}
]
}
}{
"data": [...],
"pagination": {
"current_page": 1,
"per_page": 20,
"total_pages": 5,
"total_count": 100,
"has_next": true,
"has_prev": false
}
}