# Referência da API SimpleCRM / SimpleCRM API Reference

> Especificação completa de todos os endpoints REST da API do SimpleCRM.

- **URL Base**: `https://crm.acessocomercial.com/api`
- **Autenticação**: API Key via header `X-API-Key`
- **Rate limit**: 60 req/min
- **Formato**: JSON
- **IDs**: 24 caracteres hex (MongoDB ObjectId)

---

## Contatos

CRUD completo para gerenciamento de contatos e leads.

### GET `/api/contacts`

**Listar Contatos** _(requer autenticação / requires authentication)_

Retorna a lista paginada de contatos do usuário. Suporta busca por nome ou email.

**Query Parameters:**

| Campo / Field | Tipo / Type | Obrigatório / Required | Descrição / Description |
|---------------|-------------|------------------------|--------------------------|
| `page` | integer | Não / No | Número da página (padrão: 1) |
| `limit` | integer | Não / No | Itens por página (padrão: 20, máx: 100) |
| `search` | string | Não / No | Busca por nome ou email |

**Exemplo de Resposta / Response Example:**

```json
{
  "data": [
    {
      "id": "507f1f77bcf86cd799439011",
      "name": "Maria Santos",
      "email": "maria@empresa.com",
      "phone": "+5511987654321",
      "position": "Diretora Comercial",
      "companyId": "507f1f77bcf86cd799439022",
      "tags": ["vip", "recorrente"],
      "notes": "Prefere contato por WhatsApp",
      "createdAt": "2026-03-10T14:20:00Z",
      "updatedAt": "2026-04-01T09:15:00Z"
    }
  ],
  "total": 142,
  "page": 1,
  "limit": 20
}
```

**Códigos de Status / Status Codes:**

- `200`: Lista retornada com sucesso
- `401`: Não autenticado

### POST `/api/contacts`

**Criar Contato** _(requer autenticação / requires authentication)_

Cria um novo contato vinculado ao usuário autenticado.

**Request Body (JSON):**

| Campo / Field | Tipo / Type | Obrigatório / Required | Descrição / Description |
|---------------|-------------|------------------------|--------------------------|
| `name` | string | Sim / Yes | Nome completo do contato |
| `email` | string | Não / No | Email do contato |
| `phone` | string | Não / No | Telefone com DDD (+5511...) |
| `position` | string | Não / No | Cargo ou função |
| `notes` | string | Não / No | Observações livres |

**Exemplo de Requisição / Request Example:**

```json
{
  "name": "Maria Santos",
  "email": "maria@empresa.com",
  "phone": "+5511987654321",
  "position": "Diretora Comercial",
  "notes": "Prefere contato por WhatsApp"
}
```

**Exemplo de Resposta / Response Example:**

```json
{
  "id": "507f1f77bcf86cd799439011",
  "name": "Maria Santos",
  "email": "maria@empresa.com",
  "phone": "+5511987654321",
  "position": "Diretora Comercial",
  "notes": "Prefere contato por WhatsApp",
  "tags": [],
  "createdAt": "2026-05-07T10:00:00Z",
  "updatedAt": "2026-05-07T10:00:00Z"
}
```

**Códigos de Status / Status Codes:**

- `201`: Criado com sucesso
- `400`: Dados inválidos
- `401`: Não autenticado

### GET `/api/contacts/:id`

**Buscar Contato por ID** _(requer autenticação / requires authentication)_

Retorna os dados completos de um contato específico. Apenas o proprietário pode visualizar.

**Exemplo de Resposta / Response Example:**

```json
{
  "id": "507f1f77bcf86cd799439011",
  "name": "Maria Santos",
  "email": "maria@empresa.com",
  "phone": "+5511987654321",
  "position": "Diretora Comercial",
  "companyId": "507f1f77bcf86cd799439022",
  "tags": ["vip"],
  "notes": "Prefere contato por WhatsApp",
  "createdAt": "2026-03-10T14:20:00Z",
  "updatedAt": "2026-04-01T09:15:00Z"
}
```

**Códigos de Status / Status Codes:**

- `200`: Registro encontrado
- `401`: Não autenticado
- `403`: Sem permissão (não é o proprietário)
- `404`: Não encontrado

### PUT `/api/contacts/:id`

**Atualizar Contato** _(requer autenticação / requires authentication)_

Atualiza os dados de um contato existente. Envie apenas os campos que deseja modificar.

**Request Body (JSON):**

| Campo / Field | Tipo / Type | Obrigatório / Required | Descrição / Description |
|---------------|-------------|------------------------|--------------------------|
| `name` | string | Não / No | Nome completo |
| `email` | string | Não / No | Email |
| `phone` | string | Não / No | Telefone |
| `position` | string | Não / No | Cargo |
| `notes` | string | Não / No | Observações |

**Exemplo de Requisição / Request Example:**

```json
{
  "position": "CEO",
  "notes": "Promovida em maio/2026"
}
```

**Exemplo de Resposta / Response Example:**

```json
{
  "id": "507f1f77bcf86cd799439011",
  "name": "Maria Santos",
  "email": "maria@empresa.com",
  "position": "CEO",
  "notes": "Promovida em maio/2026",
  "updatedAt": "2026-05-07T15:30:00Z"
}
```

**Códigos de Status / Status Codes:**

- `200`: Atualizado com sucesso
- `400`: Dados inválidos
- `401`: Não autenticado
- `403`: Sem permissão (não é o proprietário)
- `404`: Não encontrado

### DELETE `/api/contacts/:id`

**Remover Contato** _(requer autenticação / requires authentication)_

Remove permanentemente um contato. Esta ação não pode ser desfeita.

**Exemplo de Resposta / Response Example:**

```json
{
  "message": "Contact deleted successfully"
}
```

**Códigos de Status / Status Codes:**

- `200`: Removido com sucesso
- `401`: Não autenticado
- `403`: Sem permissão (não é o proprietário)
- `404`: Não encontrado

---

## Empresas

Gerenciamento de empresas e organizações vinculadas aos contatos.

### GET `/api/companies`

**Listar Empresas** _(requer autenticação / requires authentication)_

Retorna a lista paginada de empresas do usuário autenticado.

**Query Parameters:**

| Campo / Field | Tipo / Type | Obrigatório / Required | Descrição / Description |
|---------------|-------------|------------------------|--------------------------|
| `page` | integer | Não / No | Número da página (padrão: 1) |
| `limit` | integer | Não / No | Itens por página (padrão: 20, máx: 100) |
| `search` | string | Não / No | Busca por nome ou email |

**Exemplo de Resposta / Response Example:**

```json
{
  "data": [
    {
      "id": "507f1f77bcf86cd799439022",
      "name": "Tech Solutions Ltda",
      "cnpj": "12.345.678/0001-90",
      "website": "https://techsolutions.com.br",
      "industry": "Tecnologia",
      "size": "11-50",
      "notes": "Cliente desde 2024",
      "createdAt": "2026-02-20T08:00:00Z"
    }
  ],
  "total": 38,
  "page": 1,
  "limit": 20
}
```

**Códigos de Status / Status Codes:**

- `200`: Lista retornada com sucesso
- `401`: Não autenticado

### POST `/api/companies`

**Criar Empresa** _(requer autenticação / requires authentication)_

Cadastra uma nova empresa.

**Request Body (JSON):**

| Campo / Field | Tipo / Type | Obrigatório / Required | Descrição / Description |
|---------------|-------------|------------------------|--------------------------|
| `name` | string | Sim / Yes | Razão social ou nome fantasia |
| `cnpj` | string | Não / No | CNPJ (formato livre, validado automaticamente) |
| `website` | string | Não / No | URL do site |
| `industry` | string | Não / No | Setor de atuação |
| `size` | string | Não / No | Porte: 1-10, 11-50, 51-200, 201-1000, 1000+ |
| `notes` | string | Não / No | Observações |

**Exemplo de Requisição / Request Example:**

```json
{
  "name": "Tech Solutions Ltda",
  "cnpj": "12.345.678/0001-90",
  "website": "https://techsolutions.com.br",
  "industry": "Tecnologia",
  "size": "11-50"
}
```

**Exemplo de Resposta / Response Example:**

```json
{
  "id": "507f1f77bcf86cd799439022",
  "name": "Tech Solutions Ltda",
  "cnpj": "12.345.678/0001-90",
  "website": "https://techsolutions.com.br",
  "industry": "Tecnologia",
  "size": "11-50",
  "createdAt": "2026-05-07T10:00:00Z"
}
```

**Códigos de Status / Status Codes:**

- `201`: Criado com sucesso
- `400`: Dados inválidos
- `401`: Não autenticado

### GET `/api/companies/:id`

**Buscar Empresa por ID** _(requer autenticação / requires authentication)_

Retorna os dados completos de uma empresa específica.

**Exemplo de Resposta / Response Example:**

```json
{
  "id": "507f1f77bcf86cd799439022",
  "name": "Tech Solutions Ltda",
  "cnpj": "12.345.678/0001-90",
  "website": "https://techsolutions.com.br",
  "industry": "Tecnologia",
  "size": "11-50",
  "notes": "Cliente desde 2024",
  "createdAt": "2026-02-20T08:00:00Z",
  "updatedAt": "2026-04-15T11:00:00Z"
}
```

**Códigos de Status / Status Codes:**

- `200`: Registro encontrado
- `401`: Não autenticado
- `403`: Sem permissão (não é o proprietário)
- `404`: Não encontrado

### PUT `/api/companies/:id`

**Atualizar Empresa** _(requer autenticação / requires authentication)_

Atualiza os dados de uma empresa existente. Envie apenas os campos que deseja modificar.

**Request Body (JSON):**

| Campo / Field | Tipo / Type | Obrigatório / Required | Descrição / Description |
|---------------|-------------|------------------------|--------------------------|
| `name` | string | Não / No | Razão social |
| `cnpj` | string | Não / No | CNPJ |
| `website` | string | Não / No | URL do site |
| `industry` | string | Não / No | Setor de atuação |
| `size` | string | Não / No | Porte |
| `notes` | string | Não / No | Observações |

**Exemplo de Requisição / Request Example:**

```json
{
  "industry": "SaaS",
  "notes": "Renovação contrato Q3/2026"
}
```

**Exemplo de Resposta / Response Example:**

```json
{
  "id": "507f1f77bcf86cd799439022",
  "name": "Tech Solutions Ltda",
  "industry": "SaaS",
  "notes": "Renovação contrato Q3/2026",
  "updatedAt": "2026-05-07T15:30:00Z"
}
```

**Códigos de Status / Status Codes:**

- `200`: Atualizado com sucesso
- `400`: Dados inválidos
- `401`: Não autenticado
- `403`: Sem permissão (não é o proprietário)
- `404`: Não encontrado

### DELETE `/api/companies/:id`

**Remover Empresa** _(requer autenticação / requires authentication)_

Remove permanentemente uma empresa. Contatos vinculados não são excluídos.

**Exemplo de Resposta / Response Example:**

```json
{
  "message": "Empresa excluída com sucesso"
}
```

**Códigos de Status / Status Codes:**

- `200`: Removido com sucesso
- `401`: Não autenticado
- `403`: Sem permissão (não é o proprietário)
- `404`: Não encontrado

---

## Negócios

Funil de vendas: criação, atualização de estágio e acompanhamento de negócios.

### GET `/api/deals`

**Listar Negócios** _(requer autenticação / requires authentication)_

Retorna todos os negócios do funil de vendas do usuário, com paginação e filtros.

**Query Parameters:**

| Campo / Field | Tipo / Type | Obrigatório / Required | Descrição / Description |
|---------------|-------------|------------------------|--------------------------|
| `page` | integer | Não / No | Número da página |
| `limit` | integer | Não / No | Itens por página (máx: 100) |
| `status` | string | Não / No | Filtrar por status: open, won, lost |
| `stage` | string | Não / No | Filtrar por estágio do funil |

**Exemplo de Resposta / Response Example:**

```json
{
  "data": [
    {
      "id": "507f1f77bcf86cd799439033",
      "title": "Implantação ERP - Tech Solutions",
      "value": 45000.00,
      "currency": "BRL",
      "stage": "negociacao",
      "status": "open",
      "probability": 70,
      "companyId": "507f1f77bcf86cd799439022",
      "contactIds": ["507f1f77bcf86cd799439011"],
      "expectedCloseDate": "2026-06-15T00:00:00Z",
      "createdAt": "2026-04-01T10:00:00Z"
    }
  ],
  "total": 24,
  "page": 1,
  "limit": 20
}
```

**Códigos de Status / Status Codes:**

- `200`: Lista retornada com sucesso
- `401`: Não autenticado

### POST `/api/deals`

**Criar Negócio** _(requer autenticação / requires authentication)_

Cria um novo negócio no funil de vendas. O status inicial é sempre "open".

**Request Body (JSON):**

| Campo / Field | Tipo / Type | Obrigatório / Required | Descrição / Description |
|---------------|-------------|------------------------|--------------------------|
| `title` | string | Sim / Yes | Título do negócio |
| `value` | number | Sim / Yes | Valor estimado em BRL |
| `stage` | string | Não / No | Estágio inicial do funil |
| `probability` | integer | Não / No | Probabilidade de fechamento (0-100) |
| `companyId` | string | Não / No | ID da empresa relacionada |
| `contactIds` | string[] | Não / No | IDs dos contatos envolvidos |
| `expectedCloseDate` | string | Não / No | Data prevista de fechamento (ISO 8601) |

**Exemplo de Requisição / Request Example:**

```json
{
  "title": "Implantação ERP - Tech Solutions",
  "value": 45000.00,
  "stage": "novo",
  "probability": 30,
  "companyId": "507f1f77bcf86cd799439022",
  "contactIds": ["507f1f77bcf86cd799439011"],
  "expectedCloseDate": "2026-06-15T00:00:00Z"
}
```

**Exemplo de Resposta / Response Example:**

```json
{
  "id": "507f1f77bcf86cd799439033",
  "title": "Implantação ERP - Tech Solutions",
  "value": 45000.00,
  "currency": "BRL",
  "stage": "novo",
  "status": "open",
  "probability": 30,
  "createdAt": "2026-05-07T10:00:00Z"
}
```

**Códigos de Status / Status Codes:**

- `201`: Criado com sucesso
- `400`: Dados inválidos
- `401`: Não autenticado

### GET `/api/deals/:id`

**Buscar Negócio por ID** _(requer autenticação / requires authentication)_

Retorna os dados completos de um negócio específico.

**Exemplo de Resposta / Response Example:**

```json
{
  "id": "507f1f77bcf86cd799439033",
  "title": "Implantação ERP - Tech Solutions",
  "value": 45000.00,
  "currency": "BRL",
  "stage": "negociacao",
  "status": "open",
  "probability": 70,
  "companyId": "507f1f77bcf86cd799439022",
  "contactIds": ["507f1f77bcf86cd799439011"],
  "expectedCloseDate": "2026-06-15T00:00:00Z",
  "createdAt": "2026-04-01T10:00:00Z",
  "updatedAt": "2026-05-05T14:00:00Z"
}
```

**Códigos de Status / Status Codes:**

- `200`: Registro encontrado
- `401`: Não autenticado
- `403`: Sem permissão (não é o proprietário)
- `404`: Não encontrado

### PUT `/api/deals/:id`

**Atualizar Negócio** _(requer autenticação / requires authentication)_

Atualiza dados de um negócio. Use para mover entre estágios do funil ou alterar valores.

**Request Body (JSON):**

| Campo / Field | Tipo / Type | Obrigatório / Required | Descrição / Description |
|---------------|-------------|------------------------|--------------------------|
| `title` | string | Não / No | Título |
| `value` | number | Não / No | Valor em BRL |
| `stage` | string | Não / No | Estágio do funil |
| `status` | string | Não / No | Status: open, won, lost |
| `probability` | integer | Não / No | Probabilidade (0-100) |
| `expectedCloseDate` | string | Não / No | Data prevista (ISO 8601) |

**Exemplo de Requisição / Request Example:**

```json
{
  "stage": "fechado",
  "status": "won",
  "probability": 100
}
```

**Exemplo de Resposta / Response Example:**

```json
{
  "id": "507f1f77bcf86cd799439033",
  "title": "Implantação ERP - Tech Solutions",
  "value": 45000.00,
  "stage": "fechado",
  "status": "won",
  "probability": 100,
  "updatedAt": "2026-05-07T15:30:00Z"
}
```

**Códigos de Status / Status Codes:**

- `200`: Atualizado com sucesso
- `400`: Dados inválidos
- `401`: Não autenticado
- `403`: Sem permissão (não é o proprietário)
- `404`: Não encontrado

### DELETE `/api/deals/:id`

**Remover Negócio** _(requer autenticação / requires authentication)_

Remove permanentemente um negócio do funil de vendas.

**Exemplo de Resposta / Response Example:**

```json
{
  "message": "Negócio excluído com sucesso"
}
```

**Códigos de Status / Status Codes:**

- `200`: Removido com sucesso
- `401`: Não autenticado
- `403`: Sem permissão (não é o proprietário)
- `404`: Não encontrado

### GET `/api/deals/pipeline-stats`

**Estatísticas do Funil de Vendas** _(requer autenticação / requires authentication)_

Retorna estatísticas agregadas do funil de vendas: total por estágio, valores e contagens.

**Exemplo de Resposta / Response Example:**

```json
{
  "totalDeals": 24,
  "totalValue": 380000.00,
  "byStage": {
    "novo": { "count": 8, "value": 120000 },
    "negociacao": { "count": 10, "value": 180000 },
    "fechado": { "count": 6, "value": 80000 }
  },
  "wonDeals": 15,
  "lostDeals": 5,
  "conversionRate": 75.0
}
```

**Códigos de Status / Status Codes:**

- `200`: Lista retornada com sucesso
- `401`: Não autenticado

---

## Tarefas

Gerenciamento de tarefas, follow-ups e calendário de atividades.

### GET `/api/tasks`

**Listar Tarefas** _(requer autenticação / requires authentication)_

Retorna a lista paginada de tarefas do usuário.

**Query Parameters:**

| Campo / Field | Tipo / Type | Obrigatório / Required | Descrição / Description |
|---------------|-------------|------------------------|--------------------------|
| `page` | integer | Não / No | Número da página |
| `limit` | integer | Não / No | Itens por página (máx: 100) |

**Exemplo de Resposta / Response Example:**

```json
{
  "data": [
    {
      "id": "507f1f77bcf86cd799439044",
      "title": "Follow-up proposta Tech Solutions",
      "description": "Ligar para Maria sobre desconto",
      "dueDate": "2026-05-10T14:00:00Z",
      "priority": "high",
      "completed": false,
      "contactId": "507f1f77bcf86cd799439011",
      "dealId": "507f1f77bcf86cd799439033",
      "createdAt": "2026-05-07T10:00:00Z"
    }
  ],
  "total": 18,
  "page": 1,
  "limit": 20
}
```

**Códigos de Status / Status Codes:**

- `200`: Lista retornada com sucesso
- `401`: Não autenticado

### POST `/api/tasks`

**Criar Tarefa** _(requer autenticação / requires authentication)_

Cria uma nova tarefa vinculada opcionalmente a um contato ou negócio.

**Request Body (JSON):**

| Campo / Field | Tipo / Type | Obrigatório / Required | Descrição / Description |
|---------------|-------------|------------------------|--------------------------|
| `title` | string | Sim / Yes | Título da tarefa |
| `description` | string | Não / No | Descrição detalhada |
| `dueDate` | string | Não / No | Data de vencimento (ISO 8601) |
| `priority` | string | Não / No | Prioridade: low, medium, high |
| `contactId` | string | Não / No | ID do contato relacionado |
| `dealId` | string | Não / No | ID do negócio relacionado |

**Exemplo de Requisição / Request Example:**

```json
{
  "title": "Follow-up proposta Tech Solutions",
  "description": "Ligar para Maria sobre desconto",
  "dueDate": "2026-05-10T14:00:00Z",
  "priority": "high",
  "contactId": "507f1f77bcf86cd799439011",
  "dealId": "507f1f77bcf86cd799439033"
}
```

**Exemplo de Resposta / Response Example:**

```json
{
  "id": "507f1f77bcf86cd799439044",
  "title": "Follow-up proposta Tech Solutions",
  "description": "Ligar para Maria sobre desconto",
  "dueDate": "2026-05-10T14:00:00Z",
  "priority": "high",
  "completed": false,
  "createdAt": "2026-05-07T10:00:00Z"
}
```

**Códigos de Status / Status Codes:**

- `201`: Criado com sucesso
- `400`: Dados inválidos
- `401`: Não autenticado

### GET `/api/tasks/:id`

**Buscar Tarefa por ID** _(requer autenticação / requires authentication)_

Retorna os dados completos de uma tarefa específica.

**Exemplo de Resposta / Response Example:**

```json
{
  "id": "507f1f77bcf86cd799439044",
  "title": "Follow-up proposta Tech Solutions",
  "description": "Ligar para Maria sobre desconto",
  "dueDate": "2026-05-10T14:00:00Z",
  "priority": "high",
  "completed": false,
  "contactId": "507f1f77bcf86cd799439011",
  "dealId": "507f1f77bcf86cd799439033",
  "createdAt": "2026-05-07T10:00:00Z"
}
```

**Códigos de Status / Status Codes:**

- `200`: Registro encontrado
- `401`: Não autenticado
- `403`: Sem permissão (não é o proprietário)
- `404`: Não encontrado

### PUT `/api/tasks/:id`

**Atualizar Tarefa** _(requer autenticação / requires authentication)_

Atualiza os dados de uma tarefa existente.

**Request Body (JSON):**

| Campo / Field | Tipo / Type | Obrigatório / Required | Descrição / Description |
|---------------|-------------|------------------------|--------------------------|
| `title` | string | Não / No | Título |
| `description` | string | Não / No | Descrição |
| `dueDate` | string | Não / No | Data de vencimento (ISO 8601) |
| `priority` | string | Não / No | Prioridade: low, medium, high |

**Exemplo de Requisição / Request Example:**

```json
{
  "dueDate": "2026-05-12T14:00:00Z",
  "priority": "medium"
}
```

**Exemplo de Resposta / Response Example:**

```json
{
  "id": "507f1f77bcf86cd799439044",
  "title": "Follow-up proposta Tech Solutions",
  "dueDate": "2026-05-12T14:00:00Z",
  "priority": "medium",
  "updatedAt": "2026-05-07T15:30:00Z"
}
```

**Códigos de Status / Status Codes:**

- `200`: Atualizado com sucesso
- `400`: Dados inválidos
- `401`: Não autenticado
- `403`: Sem permissão (não é o proprietário)
- `404`: Não encontrado

### DELETE `/api/tasks/:id`

**Remover Tarefa** _(requer autenticação / requires authentication)_

Remove permanentemente uma tarefa.

**Exemplo de Resposta / Response Example:**

```json
{
  "message": "Tarefa excluída com sucesso"
}
```

**Códigos de Status / Status Codes:**

- `200`: Removido com sucesso
- `401`: Não autenticado
- `403`: Sem permissão (não é o proprietário)
- `404`: Não encontrado

### POST `/api/tasks/:id/complete`

**Marcar como Concluída** _(requer autenticação / requires authentication)_

Marca uma tarefa como concluída. Define o campo completed como true e registra a data.

**Exemplo de Resposta / Response Example:**

```json
{
  "id": "507f1f77bcf86cd799439044",
  "title": "Follow-up proposta Tech Solutions",
  "completed": true,
  "completedAt": "2026-05-07T16:00:00Z"
}
```

**Códigos de Status / Status Codes:**

- `200`: Tarefa concluída
- `403`: Sem permissão
- `404`: Não encontrada

### GET `/api/tasks/overdue`

**Tarefas Atrasadas** _(requer autenticação / requires authentication)_

Retorna todas as tarefas cujo prazo já venceu e ainda não foram concluídas.

**Exemplo de Resposta / Response Example:**

```json
{
  "data": [
    {
      "id": "507f1f77bcf86cd799439044",
      "title": "Enviar contrato assinado",
      "dueDate": "2026-05-01T00:00:00Z",
      "priority": "high",
      "completed": false
    }
  ],
  "total": 3
}
```

**Códigos de Status / Status Codes:**

- `200`: Lista retornada com sucesso
- `401`: Não autenticado

### GET `/api/tasks/upcoming`

**Tarefas Próximas** _(requer autenticação / requires authentication)_

Retorna as tarefas com vencimento nos próximos 7 dias.

**Exemplo de Resposta / Response Example:**

```json
{
  "data": [
    {
      "id": "507f1f77bcf86cd799439045",
      "title": "Reunião cliente XYZ",
      "dueDate": "2026-05-09T10:00:00Z",
      "priority": "high",
      "completed": false
    }
  ],
  "total": 5
}
```

**Códigos de Status / Status Codes:**

- `200`: Lista retornada com sucesso
- `401`: Não autenticado

### GET `/api/tasks/calendar`

**Calendário de Tarefas** _(requer autenticação / requires authentication)_

Retorna tarefas agrupadas por data para exibição em calendário.

**Query Parameters:**

| Campo / Field | Tipo / Type | Obrigatório / Required | Descrição / Description |
|---------------|-------------|------------------------|--------------------------|
| `start` | string | Não / No | Data início do período (ISO 8601) |
| `end` | string | Não / No | Data fim do período (ISO 8601) |

**Exemplo de Resposta / Response Example:**

```json
{
  "data": [
    {
      "id": "507f1f77bcf86cd799439044",
      "title": "Follow-up Tech Solutions",
      "dueDate": "2026-05-10T14:00:00Z",
      "priority": "high",
      "completed": false
    }
  ]
}
```

**Códigos de Status / Status Codes:**

- `200`: Lista retornada com sucesso
- `401`: Não autenticado

---

## Produtos

Catálogo de produtos e serviços com preços e categorias.

### GET `/api/products`

**Listar Produtos** _(requer autenticação / requires authentication)_

Retorna a lista paginada de produtos do catálogo.

**Query Parameters:**

| Campo / Field | Tipo / Type | Obrigatório / Required | Descrição / Description |
|---------------|-------------|------------------------|--------------------------|
| `page` | integer | Não / No | Número da página (padrão: 1) |
| `limit` | integer | Não / No | Itens por página (padrão: 20, máx: 100) |
| `search` | string | Não / No | Busca por nome ou email |

**Exemplo de Resposta / Response Example:**

```json
{
  "data": [
    {
      "id": "507f1f77bcf86cd799439055",
      "name": "Consultoria Mensal",
      "description": "40h de consultoria comercial",
      "price": 3500.00,
      "sku": "CONS-001",
      "category": "Serviços",
      "active": true,
      "createdAt": "2026-03-01T10:00:00Z"
    }
  ],
  "total": 15,
  "page": 1,
  "limit": 20
}
```

**Códigos de Status / Status Codes:**

- `200`: Lista retornada com sucesso
- `401`: Não autenticado

### POST `/api/products`

**Criar Produto** _(requer autenticação / requires authentication)_

Adiciona um novo produto ao catálogo. Integrado com cotações e faturas.

**Request Body (JSON):**

| Campo / Field | Tipo / Type | Obrigatório / Required | Descrição / Description |
|---------------|-------------|------------------------|--------------------------|
| `name` | string | Sim / Yes | Nome do produto |
| `description` | string | Não / No | Descrição |
| `price` | number | Sim / Yes | Preço unitário em BRL |
| `sku` | string | Não / No | Código SKU |
| `category` | string | Não / No | Categoria |

**Exemplo de Requisição / Request Example:**

```json
{
  "name": "Consultoria Mensal",
  "description": "40h de consultoria comercial",
  "price": 3500.00,
  "sku": "CONS-001",
  "category": "Serviços"
}
```

**Exemplo de Resposta / Response Example:**

```json
{
  "id": "507f1f77bcf86cd799439055",
  "name": "Consultoria Mensal",
  "description": "40h de consultoria comercial",
  "price": 3500.00,
  "sku": "CONS-001",
  "category": "Serviços",
  "active": true,
  "createdAt": "2026-05-07T10:00:00Z"
}
```

**Códigos de Status / Status Codes:**

- `201`: Criado com sucesso
- `400`: Dados inválidos
- `401`: Não autenticado

### GET `/api/products/:id`

**Buscar Produto por ID** _(requer autenticação / requires authentication)_

Retorna os dados completos de um produto específico.

**Exemplo de Resposta / Response Example:**

```json
{
  "id": "507f1f77bcf86cd799439055",
  "name": "Consultoria Mensal",
  "description": "40h de consultoria comercial",
  "price": 3500.00,
  "sku": "CONS-001",
  "category": "Serviços",
  "active": true,
  "createdAt": "2026-03-01T10:00:00Z",
  "updatedAt": "2026-04-15T11:00:00Z"
}
```

**Códigos de Status / Status Codes:**

- `200`: Registro encontrado
- `401`: Não autenticado
- `403`: Sem permissão (não é o proprietário)
- `404`: Não encontrado

### PUT `/api/products/:id`

**Atualizar Produto** _(requer autenticação / requires authentication)_

Atualiza os dados de um produto existente.

**Request Body (JSON):**

| Campo / Field | Tipo / Type | Obrigatório / Required | Descrição / Description |
|---------------|-------------|------------------------|--------------------------|
| `name` | string | Não / No | Nome |
| `description` | string | Não / No | Descrição |
| `price` | number | Não / No | Preço unitário em BRL |
| `sku` | string | Não / No | Código SKU |
| `category` | string | Não / No | Categoria |
| `active` | boolean | Não / No | Se o produto está ativo |

**Exemplo de Requisição / Request Example:**

```json
{
  "price": 4000.00,
  "description": "50h de consultoria comercial"
}
```

**Exemplo de Resposta / Response Example:**

```json
{
  "id": "507f1f77bcf86cd799439055",
  "name": "Consultoria Mensal",
  "price": 4000.00,
  "description": "50h de consultoria comercial",
  "updatedAt": "2026-05-07T15:30:00Z"
}
```

**Códigos de Status / Status Codes:**

- `200`: Atualizado com sucesso
- `400`: Dados inválidos
- `401`: Não autenticado
- `403`: Sem permissão (não é o proprietário)
- `404`: Não encontrado

### DELETE `/api/products/:id`

**Remover Produto** _(requer autenticação / requires authentication)_

Remove permanentemente um produto do catálogo. Faturas e cotações existentes não são afetadas.

**Exemplo de Resposta / Response Example:**

```json
{
  "message": "Produto excluído com sucesso"
}
```

**Códigos de Status / Status Codes:**

- `200`: Removido com sucesso
- `401`: Não autenticado
- `403`: Sem permissão (não é o proprietário)
- `404`: Não encontrado

---

## Faturas

Criação, acompanhamento e gestão de faturas e pagamentos.

### GET `/api/invoices`

**Listar Faturas** _(requer autenticação / requires authentication)_

Retorna a lista paginada de faturas do usuário.

**Query Parameters:**

| Campo / Field | Tipo / Type | Obrigatório / Required | Descrição / Description |
|---------------|-------------|------------------------|--------------------------|
| `page` | integer | Não / No | Número da página |
| `limit` | integer | Não / No | Itens por página (máx: 100) |
| `status` | string | Não / No | Filtrar por status: pending, paid, overdue, cancelled |

**Exemplo de Resposta / Response Example:**

```json
{
  "data": [
    {
      "id": "507f1f77bcf86cd799439066",
      "number": "INV-2026-0042",
      "contactId": "507f1f77bcf86cd799439011",
      "total": 7000.00,
      "status": "pending",
      "dueDate": "2026-06-07T00:00:00Z",
      "createdAt": "2026-05-07T10:00:00Z"
    }
  ],
  "total": 28,
  "page": 1,
  "limit": 20
}
```

**Códigos de Status / Status Codes:**

- `200`: Lista retornada com sucesso
- `401`: Não autenticado

### POST `/api/invoices`

**Criar Fatura** _(requer autenticação / requires authentication)_

Gera uma nova fatura com itens do catálogo de produtos.

**Request Body (JSON):**

| Campo / Field | Tipo / Type | Obrigatório / Required | Descrição / Description |
|---------------|-------------|------------------------|--------------------------|
| `contactId` | string | Sim / Yes | ID do contato (cliente) |
| `items` | object[] | Sim / Yes | Lista de itens: { productId, quantity, unitPrice } |
| `dueDate` | string | Sim / Yes | Data de vencimento (ISO 8601) |
| `notes` | string | Não / No | Observações |

**Exemplo de Requisição / Request Example:**

```json
{
  "contactId": "507f1f77bcf86cd799439011",
  "items": [
    {
      "productId": "507f1f77bcf86cd799439055",
      "quantity": 2,
      "unitPrice": 3500.00
    }
  ],
  "dueDate": "2026-06-07T00:00:00Z",
  "notes": "Pagamento via PIX"
}
```

**Exemplo de Resposta / Response Example:**

```json
{
  "id": "507f1f77bcf86cd799439066",
  "number": "INV-2026-0042",
  "contactId": "507f1f77bcf86cd799439011",
  "items": [
    {
      "productId": "507f1f77bcf86cd799439055",
      "name": "Consultoria Mensal",
      "quantity": 2,
      "unitPrice": 3500.00,
      "total": 7000.00
    }
  ],
  "subtotal": 7000.00,
  "total": 7000.00,
  "status": "pending",
  "dueDate": "2026-06-07T00:00:00Z",
  "createdAt": "2026-05-07T10:00:00Z"
}
```

**Códigos de Status / Status Codes:**

- `201`: Criado com sucesso
- `400`: Dados inválidos
- `401`: Não autenticado

### GET `/api/invoices/:id`

**Buscar Fatura por ID** _(requer autenticação / requires authentication)_

Retorna os dados completos de uma fatura específica com itens detalhados.

**Exemplo de Resposta / Response Example:**

```json
{
  "id": "507f1f77bcf86cd799439066",
  "number": "INV-2026-0042",
  "contactId": "507f1f77bcf86cd799439011",
  "items": [
    {
      "productId": "507f1f77bcf86cd799439055",
      "name": "Consultoria Mensal",
      "quantity": 2,
      "unitPrice": 3500.00,
      "total": 7000.00
    }
  ],
  "subtotal": 7000.00,
  "total": 7000.00,
  "status": "pending",
  "dueDate": "2026-06-07T00:00:00Z",
  "notes": "Pagamento via PIX",
  "createdAt": "2026-05-07T10:00:00Z",
  "updatedAt": "2026-05-07T10:00:00Z"
}
```

**Códigos de Status / Status Codes:**

- `200`: Registro encontrado
- `401`: Não autenticado
- `403`: Sem permissão (não é o proprietário)
- `404`: Não encontrado

### PUT `/api/invoices/:id`

**Atualizar Fatura** _(requer autenticação / requires authentication)_

Atualiza dados de uma fatura. Use para alterar status, itens ou data de vencimento.

**Request Body (JSON):**

| Campo / Field | Tipo / Type | Obrigatório / Required | Descrição / Description |
|---------------|-------------|------------------------|--------------------------|
| `status` | string | Não / No | Status: pending, paid, overdue, cancelled |
| `dueDate` | string | Não / No | Nova data de vencimento (ISO 8601) |
| `notes` | string | Não / No | Observações |

**Exemplo de Requisição / Request Example:**

```json
{
  "status": "paid"
}
```

**Exemplo de Resposta / Response Example:**

```json
{
  "id": "507f1f77bcf86cd799439066",
  "number": "INV-2026-0042",
  "status": "paid",
  "paidAt": "2026-05-07T16:00:00Z",
  "updatedAt": "2026-05-07T16:00:00Z"
}
```

**Códigos de Status / Status Codes:**

- `200`: Atualizado com sucesso
- `400`: Dados inválidos
- `401`: Não autenticado
- `403`: Sem permissão (não é o proprietário)
- `404`: Não encontrado

### DELETE `/api/invoices/:id`

**Remover Fatura** _(requer autenticação / requires authentication)_

Remove permanentemente uma fatura. Apenas faturas com status "pending" ou "cancelled" podem ser removidas.

**Exemplo de Resposta / Response Example:**

```json
{
  "message": "Fatura excluída com sucesso"
}
```

**Códigos de Status / Status Codes:**

- `200`: Removido com sucesso
- `401`: Não autenticado
- `403`: Sem permissão (não é o proprietário)
- `404`: Não encontrado

### GET `/api/invoices/overdue`

**Faturas Vencidas** _(requer autenticação / requires authentication)_

Retorna todas as faturas pendentes cujo prazo já expirou.

**Exemplo de Resposta / Response Example:**

```json
{
  "data": [
    {
      "id": "507f1f77bcf86cd799439066",
      "number": "INV-2026-0038",
      "contactId": "507f1f77bcf86cd799439011",
      "total": 7000.00,
      "dueDate": "2026-04-30T00:00:00Z",
      "status": "pending"
    }
  ],
  "total": 5,
  "totalValue": 23500.00
}
```

**Códigos de Status / Status Codes:**

- `200`: Lista retornada com sucesso
- `401`: Não autenticado

---

## Cotações

Propostas comerciais com conversão direta para faturas.

### GET `/api/quotes`

**Listar Cotações** _(requer autenticação / requires authentication)_

Retorna a lista paginada de cotações do usuário.

**Query Parameters:**

| Campo / Field | Tipo / Type | Obrigatório / Required | Descrição / Description |
|---------------|-------------|------------------------|--------------------------|
| `page` | integer | Não / No | Número da página |
| `limit` | integer | Não / No | Itens por página (máx: 100) |
| `status` | string | Não / No | Filtrar por status: draft, sent, accepted, rejected, converted |

**Exemplo de Resposta / Response Example:**

```json
{
  "data": [
    {
      "id": "507f1f77bcf86cd799439077",
      "number": "QT-2026-0015",
      "contactId": "507f1f77bcf86cd799439011",
      "total": 9450.00,
      "status": "sent",
      "validUntil": "2026-05-30T00:00:00Z",
      "createdAt": "2026-05-07T10:00:00Z"
    }
  ],
  "total": 12,
  "page": 1,
  "limit": 20
}
```

**Códigos de Status / Status Codes:**

- `200`: Lista retornada com sucesso
- `401`: Não autenticado

### POST `/api/quotes`

**Criar Cotação** _(requer autenticação / requires authentication)_

Gera uma proposta comercial com itens do catálogo.

**Request Body (JSON):**

| Campo / Field | Tipo / Type | Obrigatório / Required | Descrição / Description |
|---------------|-------------|------------------------|--------------------------|
| `contactId` | string | Sim / Yes | ID do contato |
| `items` | object[] | Sim / Yes | Itens: { productId, quantity, unitPrice, discount } |
| `validUntil` | string | Não / No | Data de validade (ISO 8601) |
| `notes` | string | Não / No | Condições comerciais |

**Exemplo de Requisição / Request Example:**

```json
{
  "contactId": "507f1f77bcf86cd799439011",
  "items": [
    {
      "productId": "507f1f77bcf86cd799439055",
      "quantity": 3,
      "unitPrice": 3500.00,
      "discount": 10
    }
  ],
  "validUntil": "2026-05-30T00:00:00Z",
  "notes": "Desconto para contrato anual"
}
```

**Exemplo de Resposta / Response Example:**

```json
{
  "id": "507f1f77bcf86cd799439077",
  "number": "QT-2026-0015",
  "contactId": "507f1f77bcf86cd799439011",
  "items": [...],
  "subtotal": 10500.00,
  "discount": 1050.00,
  "total": 9450.00,
  "status": "draft",
  "validUntil": "2026-05-30T00:00:00Z",
  "createdAt": "2026-05-07T10:00:00Z"
}
```

**Códigos de Status / Status Codes:**

- `201`: Criado com sucesso
- `400`: Dados inválidos
- `401`: Não autenticado

### GET `/api/quotes/:id`

**Buscar Cotação por ID** _(requer autenticação / requires authentication)_

Retorna os dados completos de uma cotação específica com itens detalhados.

**Exemplo de Resposta / Response Example:**

```json
{
  "id": "507f1f77bcf86cd799439077",
  "number": "QT-2026-0015",
  "contactId": "507f1f77bcf86cd799439011",
  "items": [
    {
      "productId": "507f1f77bcf86cd799439055",
      "name": "Consultoria Mensal",
      "quantity": 3,
      "unitPrice": 3500.00,
      "discount": 10,
      "total": 9450.00
    }
  ],
  "subtotal": 10500.00,
  "discount": 1050.00,
  "total": 9450.00,
  "status": "sent",
  "validUntil": "2026-05-30T00:00:00Z",
  "notes": "Desconto para contrato anual",
  "createdAt": "2026-05-07T10:00:00Z"
}
```

**Códigos de Status / Status Codes:**

- `200`: Registro encontrado
- `401`: Não autenticado
- `403`: Sem permissão (não é o proprietário)
- `404`: Não encontrado

### PUT `/api/quotes/:id`

**Atualizar Cotação** _(requer autenticação / requires authentication)_

Atualiza dados de uma cotação. Use para alterar status, itens ou validade.

**Request Body (JSON):**

| Campo / Field | Tipo / Type | Obrigatório / Required | Descrição / Description |
|---------------|-------------|------------------------|--------------------------|
| `status` | string | Não / No | Status: draft, sent, accepted, rejected |
| `validUntil` | string | Não / No | Nova data de validade (ISO 8601) |
| `notes` | string | Não / No | Condições comerciais |

**Exemplo de Requisição / Request Example:**

```json
{
  "status": "accepted"
}
```

**Exemplo de Resposta / Response Example:**

```json
{
  "id": "507f1f77bcf86cd799439077",
  "number": "QT-2026-0015",
  "status": "accepted",
  "updatedAt": "2026-05-07T15:30:00Z"
}
```

**Códigos de Status / Status Codes:**

- `200`: Atualizado com sucesso
- `400`: Dados inválidos
- `401`: Não autenticado
- `403`: Sem permissão (não é o proprietário)
- `404`: Não encontrado

### DELETE `/api/quotes/:id`

**Remover Cotação** _(requer autenticação / requires authentication)_

Remove permanentemente uma cotação. Apenas cotações com status "draft" podem ser removidas.

**Exemplo de Resposta / Response Example:**

```json
{
  "message": "Cotação excluída com sucesso"
}
```

**Códigos de Status / Status Codes:**

- `200`: Removido com sucesso
- `401`: Não autenticado
- `403`: Sem permissão (não é o proprietário)
- `404`: Não encontrado

### POST `/api/quotes/:id/convert-to-invoice`

**Converter em Fatura** _(requer autenticação / requires authentication)_

Converte uma cotação aceita em fatura. Itens, valores e condições são copiados automaticamente.

**Exemplo de Resposta / Response Example:**

```json
{
  "invoice": {
    "id": "507f1f77bcf86cd799439088",
    "number": "INV-2026-0043",
    "total": 9450.00,
    "status": "pending",
    "createdAt": "2026-05-07T12:00:00Z"
  },
  "quote": {
    "id": "507f1f77bcf86cd799439077",
    "status": "converted"
  }
}
```

**Códigos de Status / Status Codes:**

- `201`: Fatura gerada a partir da cotação
- `400`: Cotação não pode ser convertida (status inválido)
- `404`: Cotação não encontrada

---

## Atividades

Registro de atividades e timeline de interações com contatos e negócios.

### POST `/api/activities`

**Registrar Atividade** _(requer autenticação / requires authentication)_

Registra uma nova atividade vinculada a um contato, empresa ou negócio.

**Request Body (JSON):**

| Campo / Field | Tipo / Type | Obrigatório / Required | Descrição / Description |
|---------------|-------------|------------------------|--------------------------|
| `type` | string | Sim / Yes | Tipo: call, email, meeting, note, task |
| `description` | string | Sim / Yes | Descrição da atividade |
| `relatedTo` | string | Sim / Yes | ID da entidade relacionada (contato, empresa ou negócio) |
| `relatedType` | string | Sim / Yes | Tipo da entidade: contact, company, deal |
| `metadata` | object | Não / No | Dados adicionais livres (ex: duração da ligação) |

**Exemplo de Requisição / Request Example:**

```json
{
  "type": "call",
  "description": "Ligação para alinhar proposta comercial",
  "relatedTo": "507f1f77bcf86cd799439011",
  "relatedType": "contact",
  "metadata": { "duration": "15min" }
}
```

**Exemplo de Resposta / Response Example:**

```json
{
  "id": "507f1f77bcf86cd799439111",
  "type": "call",
  "description": "Ligação para alinhar proposta comercial",
  "relatedTo": "507f1f77bcf86cd799439011",
  "relatedType": "contact",
  "metadata": { "duration": "15min" },
  "createdBy": "507f1f77bcf86cd799439001",
  "createdAt": "2026-05-07T10:00:00Z"
}
```

**Códigos de Status / Status Codes:**

- `201`: Criado com sucesso
- `400`: Dados inválidos
- `401`: Não autenticado

### GET `/api/activities/recent`

**Atividades Recentes** _(requer autenticação / requires authentication)_

Retorna as atividades mais recentes do usuário autenticado.

**Query Parameters:**

| Campo / Field | Tipo / Type | Obrigatório / Required | Descrição / Description |
|---------------|-------------|------------------------|--------------------------|
| `limit` | integer | Não / No | Quantidade de atividades (padrão: 10, máx: 100) |

**Exemplo de Resposta / Response Example:**

```json
{
  "data": [
    {
      "id": "507f1f77bcf86cd799439111",
      "type": "call",
      "description": "Ligação para alinhar proposta",
      "relatedTo": "507f1f77bcf86cd799439011",
      "relatedType": "contact",
      "createdAt": "2026-05-07T10:00:00Z"
    }
  ]
}
```

**Códigos de Status / Status Codes:**

- `200`: Lista retornada com sucesso
- `401`: Não autenticado

### GET `/api/activities/entity/:entityId`

**Atividades por Entidade** _(requer autenticação / requires authentication)_

Retorna todas as atividades vinculadas a um contato, empresa ou negócio específico.

**Query Parameters:**

| Campo / Field | Tipo / Type | Obrigatório / Required | Descrição / Description |
|---------------|-------------|------------------------|--------------------------|
| `page` | integer | Não / No | Número da página |
| `limit` | integer | Não / No | Itens por página (máx: 100) |

**Exemplo de Resposta / Response Example:**

```json
{
  "data": [
    {
      "id": "507f1f77bcf86cd799439111",
      "type": "call",
      "description": "Ligação comercial",
      "relatedTo": "507f1f77bcf86cd799439011",
      "relatedType": "contact",
      "createdAt": "2026-05-07T10:00:00Z"
    }
  ],
  "total": 8,
  "page": 1,
  "limit": 20
}
```

**Códigos de Status / Status Codes:**

- `200`: Lista retornada com sucesso
- `401`: Não autenticado

---

## Relatórios

Dashboards, métricas de vendas e análises de performance.

### GET `/api/reports/dashboard`

**Dashboard Geral** _(requer autenticação / requires authentication)_

Retorna as principais métricas do CRM: contatos, negócios, receita e tarefas.

**Exemplo de Resposta / Response Example:**

```json
{
  "totalContacts": 142,
  "totalDeals": 24,
  "openDeals": 18,
  "totalRevenue": 125000.00,
  "pendingInvoices": 8,
  "overdueInvoices": 3,
  "overdueTasks": 5,
  "dealsWonThisMonth": 4,
  "revenueThisMonth": 32000.00
}
```

**Códigos de Status / Status Codes:**

- `200`: Lista retornada com sucesso
- `401`: Não autenticado

### GET `/api/reports/deal-conversion`

**Taxa de Conversão** _(requer autenticação / requires authentication)_

Retorna métricas de conversão do funil de vendas.

**Exemplo de Resposta / Response Example:**

```json
{
  "totalDeals": 50,
  "wonDeals": 18,
  "lostDeals": 12,
  "openDeals": 20,
  "conversionRate": 60.0,
  "averageTicket": 8500.00,
  "averageCycleDays": 22
}
```

**Códigos de Status / Status Codes:**

- `200`: Lista retornada com sucesso
- `401`: Não autenticado

### GET `/api/reports/task-completion`

**Conclusão de Tarefas** _(requer autenticação / requires authentication)_

Retorna métricas de conclusão de tarefas: total, concluídas, atrasadas e taxa de conclusão.

**Exemplo de Resposta / Response Example:**

```json
{
  "totalTasks": 45,
  "completedTasks": 32,
  "overdueTasks": 5,
  "pendingTasks": 8,
  "completionRate": 71.1,
  "averageCompletionDays": 3.2
}
```

**Códigos de Status / Status Codes:**

- `200`: Lista retornada com sucesso
- `401`: Não autenticado

### GET `/api/reports/pipeline`

**Relatório do Funil de Vendas** _(requer autenticação / requires authentication)_

Retorna análise detalhada do funil de vendas com métricas por estágio.

**Exemplo de Resposta / Response Example:**

```json
{
  "totalValue": 380000.00,
  "weightedValue": 245000.00,
  "stages": [
    { "name": "Prospecção", "count": 8, "value": 120000.00 },
    { "name": "Qualificação", "count": 5, "value": 85000.00 },
    { "name": "Proposta", "count": 6, "value": 95000.00 },
    { "name": "Negociação", "count": 3, "value": 60000.00 },
    { "name": "Fechamento", "count": 2, "value": 20000.00 }
  ],
  "averageDealValue": 15833.33,
  "averageCycleDays": 28
}
```

**Códigos de Status / Status Codes:**

- `200`: Lista retornada com sucesso
- `401`: Não autenticado

---

## Webhooks

Consulte seus webhooks configurados. Criação, edição e exclusão são feitas pela interface web.

### GET `/api/webhooks`

**Listar Webhooks** _(requer autenticação / requires authentication)_

Retorna todos os webhooks configurados pelo usuário. Para criar, editar ou remover webhooks, use a interface web do SimpleCRM.

**Exemplo de Resposta / Response Example:**

```json
{
  "data": [
    {
      "id": "507f1f77bcf86cd799439099",
      "url": "https://meusite.com/webhooks/crm",
      "events": ["contact.created", "deal.updated"],
      "isActive": true,
      "createdAt": "2026-05-01T10:00:00Z",
      "updatedAt": "2026-05-01T10:00:00Z"
    }
  ],
  "availableEvents": [
    "contact.created", "contact.updated", "contact.deleted",
    "company.created", "company.updated", "company.deleted",
    "deal.created", "deal.updated", "deal.deleted",
    "task.created", "task.completed", "task.deleted",
    "invoice.created", "invoice.updated", "invoice.paid",
    "quote.created", "quote.updated",
    "product.created", "product.updated", "product.deleted"
  ]
}
```

**Códigos de Status / Status Codes:**

- `200`: Lista retornada com sucesso
- `401`: Não autenticado

