🔐 Autenticação
⚠️ A API usa autenticação JWT (Bearer Token)
Para acessar os endpoints da API, você precisa:
- Obter seu
ClientIdeClientSecretcom o administrador do sistema - Fazer uma requisição POST para
/api/auth/tokencom suas credenciais - Receber um token JWT (válido por 60 minutos)
- Incluir o token no header
Authorization: Bearer {token}em todas as requisições
Importante: O token expira após 60 minutos. Quando expirar, você deve solicitar um novo token.
POST Obter Token de Acesso
/api/auth/token
Autentica com ClientId e ClientSecret e retorna um token JWT Bearer.
Exemplo de Request Body:
{
"clientId": "client_a1b2c3d4e5f6g7h8",
"clientSecret": "AbCdEfGhIjKlMnOpQrStUvWxYz123456"
}
Exemplo de Resposta (200 OK):
{
"sucesso": true,
"mensagem": "Token gerado com sucesso",
"dados": {
"accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"tokenType": "Bearer",
"expiresIn": 3600,
"expiresAt": "2025-12-16T11:30:00Z"
}
}
Como usar o token nas requisições:
Inclua o header Authorization com o prefixo Bearer seguido do token:
{
"Authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"Content-Type": "application/json"
}
Exemplo completo com cURL:
# 1. Obter token
curl -X POST https://seudominio.com/api/auth/token \
-H "Content-Type: application/json" \
-d '{
"clientId": "client_a1b2c3d4e5f6g7h8",
"clientSecret": "AbCdEfGhIjKlMnOpQrStUvWxYz123456"
}'
# 2. Usar token para acessar API
curl -X GET https://seudominio.com/api/candidatos \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." \
-H "Content-Type: application/json"
👥 Candidatos
GET Listar Candidatos
/api/candidatos?status=Aprovado&dataInicio=2025-01-01&dataFim=2025-12-31&incluirCampos=true
Lista todos os candidatos do cliente autenticado com filtros opcionais.
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
status |
string | Opcional | Filtrar por status: LinkEnviado, EmPreenchimento, Enviado, Aprovado, Reprovado |
dataInicio |
date | Opcional | Data de admissão início (formato: yyyy-MM-dd) |
dataFim |
date | Opcional | Data de admissão fim (formato: yyyy-MM-dd) |
incluirCampos |
boolean | Opcional | Incluir campos personalizados e administrativos. Default: true |
Exemplo de Resposta (200 OK):
{
"sucesso": true,
"mensagem": "Operação realizada com sucesso",
"dados": [
{
"id": 123,
"clienteId": 1,
"nomeCompleto": "João Silva Santos",
"cpf": "12345678900",
"email": "joao.silva@example.com",
"cargoId": 5,
"cargo": "Analista de Sistemas",
"status": "Aprovado",
"dataCriacao": "2025-01-15T10:30:00",
"camposAdministrativos": [
{
"campoId": 10,
"nomeCampo": "Matrícula",
"valor": "2025001"
},
{
"campoId": 11,
"nomeCampo": "Centro de Custo",
"valor": "TI-001"
}
],
"camposPersonalizados": [
{
"respostaId": 100,
"campoId": 20,
"nomeCampo": "Tamanho da Camisa",
"valorTexto": "M",
"nomeArquivo": null,
"urlDownload": null,
"dataResposta": "2025-01-15T14:20:00"
},
{
"respostaId": 101,
"campoId": 21,
"nomeCampo": "Certificado de Curso",
"valorTexto": null,
"nomeArquivo": "certificado_curso.pdf",
"urlDownload": "/api/candidatos/123/campos-personalizados/101/download",
"dataResposta": "2025-01-15T14:25:00"
}
],
"documentos": [
{
"id": 50,
"candidatoId": 123,
"tipoDocumento": "RG",
"nomeArquivo": "rg_frente.jpg",
"tipoConteudo": "image/jpeg",
"tamanhoArquivo": 245760,
"dataUpload": "2025-01-15T14:30:00",
"urlDownload": "/api/candidatos/123/documentos/50"
},
{
"id": 51,
"candidatoId": 123,
"tipoDocumento": "CPF",
"nomeArquivo": "cpf.pdf",
"tipoConteudo": "application/pdf",
"tamanhoArquivo": 102400,
"dataUpload": "2025-01-15T14:35:00",
"urlDownload": "/api/candidatos/123/documentos/51"
}
]
}
]
}
POST Criar Candidato
/api/candidatos
Cria um novo candidato para o cliente autenticado e envia email com link de preenchimento.
Exemplo de Request Body:
{
"email": "maria.oliveira@example.com",
"cargoId": 5,
"telefone": "(11) 98765-4321",
"celular": "(11) 99876-5432"
}
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
email |
string | Obrigatório | Email do candidato (único no sistema) |
cargoId |
integer | Opcional | ID do cargo para o qual está sendo contratado |
telefone |
string | Opcional | Telefone fixo do candidato |
celular |
string | Opcional | Celular do candidato |
Exemplo de Resposta (200 OK):
{
"sucesso": true,
"mensagem": "Candidato criado com sucesso",
"dados": {
"id": 124,
"clienteId": 1,
"nomeCompleto": null,
"cpf": null,
"email": "maria.oliveira@example.com",
"cargoId": 5,
"cargo": "Analista de Sistemas",
"status": "LinkEnviado",
"dataCriacao": "2025-12-16T10:00:00",
"camposAdministrativos": [],
"camposPersonalizados": [],
"documentos": []
}
}
GET Listar Documentos de um Candidato
/api/candidatos/{candidatoId}/documentos
Lista todos os documentos anexados a um candidato específico.
Exemplo de Resposta (200 OK):
{
"sucesso": true,
"mensagem": "Operação realizada com sucesso",
"dados": [
{
"id": 50,
"candidatoId": 123,
"tipoDocumento": "RG",
"nomeArquivo": "rg_frente.jpg",
"tipoConteudo": "image/jpeg",
"tamanhoArquivo": 245760,
"dataUpload": "2025-01-15T14:30:00",
"urlDownload": "/api/candidatos/123/documentos/50"
},
{
"id": 51,
"candidatoId": 123,
"tipoDocumento": "CPF",
"nomeArquivo": "cpf.pdf",
"tipoConteudo": "application/pdf",
"tamanhoArquivo": 102400,
"dataUpload": "2025-01-15T14:35:00",
"urlDownload": "/api/candidatos/123/documentos/51"
}
]
}
GET Download de Documento
/api/candidatos/{candidatoId}/documentos/{documentoId}
Faz o download de um documento específico. Retorna o arquivo com headers apropriados para download.
Importante: Este endpoint valida se o documento pertence ao candidato informado e se o candidato pertence ao cliente autenticado.
Importante: Este endpoint valida se o documento pertence ao candidato informado e se o candidato pertence ao cliente autenticado.
| Parâmetro | Tipo | Descrição |
|---|---|---|
candidatoId |
integer | ID do candidato (na URL) |
documentoId |
integer | ID do documento obtido na listagem (na URL) |
Resposta:
Retorna o arquivo binário com headers:
Content-Type: application/pdf (ou image/jpeg, etc.) Content-Disposition: attachment; filename="nome_arquivo.pdf"
GET Download de Arquivo de Campo Personalizado
/api/candidatos/{candidatoId}/campos-personalizados/{respostaId}/download
Faz o download de um arquivo anexado a um campo personalizado. Retorna o arquivo com headers apropriados para download.
Importante: Este endpoint valida se o campo pertence ao candidato informado e se o candidato pertence ao cliente autenticado.
Importante: Este endpoint valida se o campo pertence ao candidato informado e se o candidato pertence ao cliente autenticado.
| Parâmetro | Tipo | Descrição |
|---|---|---|
candidatoId |
integer | ID do candidato (na URL) |
respostaId |
integer | ID da resposta do campo personalizado (respostaId obtido na listagem do candidato) |
Resposta:
Retorna o arquivo binário com headers:
Content-Type: application/pdf (ou image/jpeg, etc.) Content-Disposition: attachment; filename="nome_arquivo.pdf"
📋 Cargos
GET Listar Cargos
/api/cargos?somenteAtivos=true
Lista todos os cargos disponíveis para o cliente autenticado.
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
somenteAtivos |
boolean | Opcional | Retornar apenas cargos ativos. Default: true |
Exemplo de Resposta (200 OK):
{
"sucesso": true,
"mensagem": "Operação realizada com sucesso",
"dados": [
{
"id": 5,
"empresaId": 1,
"nome": "Analista de Sistemas",
"descricao": "Responsável pela análise e desenvolvimento de sistemas",
"ativo": true,
"dataCriacao": "2025-01-01T08:00:00"
},
{
"id": 6,
"empresaId": 1,
"nome": "Desenvolvedor Full Stack",
"descricao": "Desenvolvimento de aplicações web completas",
"ativo": true,
"dataCriacao": "2025-01-01T08:00:00"
}
]
}
POST Criar Cargo
/api/cargos
Cria um novo cargo para o cliente autenticado.
Exemplo de Request Body:
{
"nome": "Gerente de Projetos",
"descricao": "Responsável pela gestão de projetos de TI",
"ativo": true
}
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
nome |
string | Obrigatório | Nome do cargo (máx. 100 caracteres) |
descricao |
string | Opcional | Descrição do cargo (máx. 500 caracteres) |
ativo |
boolean | Opcional | Se o cargo está ativo. Default: true |
Exemplo de Resposta (200 OK):
{
"sucesso": true,
"mensagem": "Cargo criado com sucesso",
"dados": {
"id": 7,
"empresaId": 1,
"nome": "Gerente de Projetos",
"descricao": "Responsável pela gestão de projetos de TI",
"ativo": true,
"dataCriacao": "2025-12-16T10:00:00"
}
}
📝 Campos Personalizados
GET Listar Campos Personalizados
/api/campos-personalizados?somenteAtivos=true
Lista todos os campos personalizados do cliente autenticado.
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
somenteAtivos |
boolean | Opcional | Retornar apenas campos ativos. Default: true |
Exemplo de Resposta (200 OK):
{
"sucesso": true,
"mensagem": "Operação realizada com sucesso",
"dados": [
{
"id": 20,
"clienteId": 1,
"nome": "Tamanho da Camisa",
"tipoCampo": "Select",
"secao": "Outros",
"placeholder": "Selecione o tamanho",
"obrigatorio": true,
"descricao": "Tamanho da camisa para uniforme",
"ordem": 1,
"ativo": true,
"dataCriacao": "2025-01-01T08:00:00",
"opcoes": [
{
"id": 1,
"texto": "Pequeno (P)",
"valor": "P",
"ordem": 1,
"ativo": true
},
{
"id": 2,
"texto": "Médio (M)",
"valor": "M",
"ordem": 2,
"ativo": true
},
{
"id": 3,
"texto": "Grande (G)",
"valor": "G",
"ordem": 3,
"ativo": true
}
]
},
{
"id": 21,
"clienteId": 1,
"nome": "Certificado de Curso",
"tipoCampo": "Arquivo",
"secao": "Documentos",
"placeholder": "Envie o certificado em PDF",
"obrigatorio": false,
"descricao": "Certificado de curso técnico ou superior",
"ordem": 2,
"ativo": true,
"dataCriacao": "2025-01-01T08:00:00",
"opcoes": null
}
]
}
POST Criar Campo Personalizado
/api/campos-personalizados
Cria um novo campo personalizado para o cliente autenticado. Para campos do tipo
Select, é obrigatório incluir a lista de opções.
Exemplo 1: Campo tipo Texto
{
"nome": "Número do Calçado",
"tipoCampo": "Texto",
"secao": "Outros",
"secaoCustomizada": null,
"placeholder": "Ex: 40",
"obrigatorio": true,
"descricao": "Número do calçado para uniforme",
"ordem": 3,
"ordemSecao": 1,
"ativo": true
}
Exemplo 2: Campo tipo Select com Opções
{
"nome": "Tamanho da Camisa",
"tipoCampo": "Select",
"secao": "Outros",
"placeholder": "Selecione o tamanho",
"obrigatorio": true,
"descricao": "Tamanho da camisa para uniforme",
"ordem": 1,
"ativo": true,
"opcoes": [
{
"texto": "Pequeno (P)",
"valor": "P",
"ordem": 1,
"ativo": true
},
{
"texto": "Médio (M)",
"valor": "M",
"ordem": 2,
"ativo": true
},
{
"texto": "Grande (G)",
"valor": "G",
"ordem": 3,
"ativo": true
},
{
"texto": "Extra Grande (GG)",
"valor": "GG",
"ordem": 4,
"ativo": true
}
]
}
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
nome |
string | Obrigatório | Nome do campo (máx. 100 caracteres) |
tipoCampo |
string | Obrigatório | Tipo: Texto, Email, Telefone, CPF, RG, Data, Arquivo, Select |
secao |
string | Obrigatório | Seção: DadosPessoais, Endereco, Documentos, Contato, Outros |
obrigatorio |
boolean | Opcional | Se o campo é obrigatório. Default: false |
placeholder |
string | Opcional | Texto de exemplo no campo (máx. 200 caracteres) |
descricao |
string | Opcional | Descrição do campo (máx. 500 caracteres) |
ordem |
integer | Opcional | Ordem de exibição. Default: 0 |
ordemSecao |
integer | Opcional | Ordem dentro da seção. Default: 0 |
ativo |
boolean | Opcional | Se o campo está ativo. Default: true |
opcoes |
array | Obrigatório* | *Obrigatório apenas para campos tipo Select. Array de objetos com: texto, valor, ordem, ativo |
Exemplo de Resposta para Campo tipo Texto (200 OK):
{
"sucesso": true,
"mensagem": "Campo criado com sucesso",
"dados": {
"id": 22,
"clienteId": 1,
"nome": "Número do Calçado",
"tipoCampo": "Texto",
"secao": "Outros",
"placeholder": "Ex: 40",
"obrigatorio": true,
"descricao": "Número do calçado para uniforme",
"ordem": 3,
"ativo": true,
"dataCriacao": "2025-12-16T10:00:00",
"opcoes": null
}
}
Exemplo de Resposta para Campo tipo Select (200 OK):
{
"sucesso": true,
"mensagem": "Campo criado com sucesso",
"dados": {
"id": 23,
"clienteId": 1,
"nome": "Tamanho da Camisa",
"tipoCampo": "Select",
"secao": "Outros",
"placeholder": "Selecione o tamanho",
"obrigatorio": true,
"descricao": "Tamanho da camisa para uniforme",
"ordem": 1,
"ativo": true,
"dataCriacao": "2025-12-16T10:00:00",
"opcoes": [
{
"id": 1,
"texto": "Pequeno (P)",
"valor": "P",
"ordem": 1,
"ativo": true
},
{
"id": 2,
"texto": "Médio (M)",
"valor": "M",
"ordem": 2,
"ativo": true
},
{
"id": 3,
"texto": "Grande (G)",
"valor": "G",
"ordem": 3,
"ativo": true
},
{
"id": 4,
"texto": "Extra Grande (GG)",
"valor": "GG",
"ordem": 4,
"ativo": true
}
]
}
}
POST Adicionar Opção a Campo Select
/api/campos-personalizados/{id}/opcoes
Adiciona uma nova opção a um campo do tipo
Select existente. Apenas campos do tipo Select podem ter opções.
Exemplo de Request Body:
{
"texto": "Extra Extra Grande (EXG)",
"valor": "EXG",
"ordem": 5,
"ativo": true
}
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
texto |
string | Obrigatório | Texto exibido ao usuário (máx. 200 caracteres) |
valor |
string | Obrigatório | Valor armazenado no banco de dados (máx. 200 caracteres) |
ordem |
integer | Opcional | Ordem de exibição. Default: 0 |
ativo |
boolean | Opcional | Se a opção está ativa. Default: true |
Exemplo de Resposta (200 OK):
{
"sucesso": true,
"mensagem": "Opção adicionada com sucesso",
"dados": {
"id": 5,
"texto": "Extra Extra Grande (EXG)",
"valor": "EXG",
"ordem": 5,
"ativo": true
}
}
PUT Atualizar Opção
/api/campos-personalizados/{campoId}/opcoes/{opcaoId}
Atualiza uma opção existente de um campo do tipo
Select.
Exemplo de Request Body:
{
"texto": "Extra Grande (XG)",
"valor": "XG",
"ordem": 4,
"ativo": true
}
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
texto |
string | Obrigatório | Texto exibido ao usuário (máx. 200 caracteres) |
valor |
string | Obrigatório | Valor armazenado no banco de dados (máx. 200 caracteres) |
ordem |
integer | Opcional | Ordem de exibição. Default: 0 |
ativo |
boolean | Opcional | Se a opção está ativa. Default: true |
Exemplo de Resposta (200 OK):
{
"sucesso": true,
"mensagem": "Opção atualizada com sucesso",
"dados": {
"id": 4,
"texto": "Extra Grande (XG)",
"valor": "XG",
"ordem": 4,
"ativo": true
}
}
DELETE Remover Opção
/api/campos-personalizados/{campoId}/opcoes/{opcaoId}
Remove (desativa) uma opção de um campo do tipo
Select. A opção não é excluída fisicamente, apenas marcada como inativa.
| Parâmetro | Tipo | Descrição |
|---|---|---|
campoId |
integer | ID do campo personalizado (na URL) |
opcaoId |
integer | ID da opção a ser removida (na URL) |
Exemplo de Resposta (200 OK):
{
"sucesso": true,
"mensagem": "Opção removida com sucesso",
"dados": null
}
⚙️ Campos Administrativos
GET Listar Campos Administrativos
/api/campos-administrativos?somenteAtivos=true
Lista todos os campos administrativos (visíveis apenas para administradores) do cliente autenticado.
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
somenteAtivos |
boolean | Opcional | Retornar apenas campos ativos. Default: true |
Exemplo de Resposta (200 OK):
{
"sucesso": true,
"mensagem": "Operação realizada com sucesso",
"dados": [
{
"id": 10,
"empresaId": 1,
"nome": "Matrícula",
"tipoCampo": "Texto",
"opcoes": null,
"obrigatorio": true,
"descricao": "Número da matrícula do funcionário",
"ordem": 1,
"ativo": true,
"dataCriacao": "2025-01-01T08:00:00"
},
{
"id": 11,
"empresaId": 1,
"nome": "Centro de Custo",
"tipoCampo": "Select",
"opcoes": "[\"TI-001\", \"RH-002\", \"FIN-003\", \"OPS-004\"]",
"obrigatorio": true,
"descricao": "Centro de custo do departamento",
"ordem": 2,
"ativo": true,
"dataCriacao": "2025-01-01T08:00:00"
}
]
}
POST Criar Campo Administrativo
/api/campos-administrativos
Cria um novo campo administrativo para o cliente autenticado.
Exemplo de Request Body:
{
"nome": "Salário",
"tipoCampo": "Numero",
"opcoes": null,
"obrigatorio": true,
"descricao": "Salário base do funcionário",
"ordem": 3,
"ativo": true
}
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
nome |
string | Obrigatório | Nome do campo (máx. 100 caracteres) |
tipoCampo |
string | Obrigatório | Tipo: Texto, Numero, Data, SimNao, Select |
opcoes |
string | Opcional | JSON array com opções para tipo Select. Ex: ["Opção 1", "Opção 2"] |
obrigatorio |
boolean | Opcional | Se o campo é obrigatório. Default: false |
descricao |
string | Opcional | Descrição do campo (máx. 500 caracteres) |
ordem |
integer | Opcional | Ordem de exibição. Default: 0 |
ativo |
boolean | Opcional | Se o campo está ativo. Default: true |
Exemplo de Resposta (200 OK):
{
"sucesso": true,
"mensagem": "Campo criado com sucesso",
"dados": {
"id": 12,
"empresaId": 1,
"nome": "Salário",
"tipoCampo": "Numero",
"opcoes": null,
"obrigatorio": true,
"descricao": "Salário base do funcionário",
"ordem": 3,
"ativo": true,
"dataCriacao": "2025-12-16T10:00:00"
}
}
⚠️ Códigos de Erro
| Código HTTP | Descrição | Exemplo de Resposta |
|---|---|---|
401 |
Não autorizado - Credenciais inválidas |
{
"sucesso": false,
"mensagem": "ClientId inválido ou cliente inativo."
}
|
400 |
Requisição inválida - Dados incorretos |
{
"sucesso": false,
"mensagem": "O campo Email é obrigatório."
}
|
404 |
Recurso não encontrado |
{
"sucesso": false,
"mensagem": "Candidato não encontrado."
}
|
500 |
Erro interno do servidor |
{
"sucesso": false,
"mensagem": "Erro ao processar requisição: [detalhes]"
}
|
ℹ️ Informações Adicionais
Formato de Data e Hora
Todas as datas são retornadas no formato ISO 8601: yyyy-MM-ddTHH:mm:ss
Exemplo: 2025-12-16T10:30:00
Charset e Codificação
Todas as requisições e respostas utilizam codificação UTF-8.
Rate Limiting
Não há limitação de taxa implementada atualmente, mas recomenda-se uso responsável da API.
Segurança
- Todas as credenciais devem ser armazenadas de forma segura
- O ClientSecret é exibido apenas uma vez após geração
- Use HTTPS em produção para proteger as credenciais em trânsito
- Cada cliente acessa apenas seus próprios dados