Skip to content

Candidatos ​

Os candidatos formam o pool de talentos da sua instância ATS: cada pessoa é registrada uma única vez, independentemente de quantas vagas ela se candidate. A mesma pessoa pode ter candidaturas em vagas de empresas diferentes, e todo o histórico fica centralizado em um único perfil.

O cadastro é feito pelo próprio candidato no portal público (endpoints /v1/ats/candidate/candidates/register e /login). Por isso, na visão do staff não existem endpoints de criação nem de exclusão — o time de recrutamento consulta, enriquece o perfil com skills e tags, e pode bloquear um candidato quando necessário.

Headers obrigatórios

Todas as requisições devem incluir o header X-Ats-Id (UUID) com o identificador da instância ATS e Authorization: Bearer {token} de um usuário do ATS (guard atsUser).


Estrutura de Dados Principal ​

Um candidato contém as seguintes informações principais:

CampoTipoDescrição
firstNameStringNome do candidato.
lastNameStringSobrenome do candidato.
emailStringE-mail de acesso ao portal.
phoneStringTelefone de contato.
headlineStringTítulo profissional (ex.: "Desenvolvedora Full Stack Plena").
summaryStringResumo profissional.
city / countryStringLocalização do candidato.
skillsArrayLista de habilidades do candidato.
experiencesArrayExperiências profissionais (title, company, startDate, endDate, current, description).
educationsArrayFormação acadêmica (degree, institution, startDate, endDate).
linksObjectLinks externos (ex.: github, linkedin).
isBlockedBooleanIndica se o candidato está bloqueado.
atsTagsArrayTags vinculadas pelo time (id, name, color).
atsFilesArrayArquivos enviados pelo candidato (ex.: currículo).
atsApplicationsArrayCandidaturas do candidato, com a vaga (atsJob) e a etapa atual (atsStage).

Endpoints do Staff ​

Endpoints protegidos para consulta e gerenciamento do pool de talentos. Requerem autenticação de usuário do ATS (atsUser).

Listar Candidatos ​

Lista os candidatos da instância com paginação e filtros. A busca por search é full-text sobre o perfil do candidato.

http
GET /v1/ats/user/candidates

Parâmetros de Query ​

NomeTipoObrigatórioDescrição
pagenumberNãoO número da página (mínimo: 1).
perPagenumberNãoItens por página (entre 1 e 100, padrão: 25).
searchstringNãoBusca full-text no perfil do candidato (máx. 150 caracteres).
skillsarrayNãoFiltra candidatos que possuem todas as skills informadas (ex.: skills[]=Node.js).
citystringNãoFiltra por cidade (busca parcial, máx. 100 caracteres).
countrystringNãoFiltra por país (busca parcial, máx. 100 caracteres).
isBlockedbooleanNãoFiltra por candidatos bloqueados (true) ou não bloqueados (false).
orderByenumNãoOrdena por id, firstName, email ou createdAt (padrão: id).
orderDirectionenumNãoDireção da ordenação: asc ou desc (padrão: desc).

Exemplo de Requisição ​

bash
curl -X GET "https://api.us.basis.tavares.in/v1/ats/user/candidates?skills[]=Node.js&city=São Paulo&page=1&perPage=25" \
  -H "X-Ats-Id: 3fa85f64-5717-4562-b3fc-2c963f66afa6" \
  -H "Authorization: Bearer {token}" \
  -H "Accept: application/json"

Respostas ​

200 OK

Retorna um objeto de paginação contendo a lista de candidatos com suas tags.

json
{
  "meta": {
    "currentPage": 1,
    "perPage": 25
  },
  "data": [
    {
      "id": 1,
      "firstName": "Maria",
      "lastName": "Silva",
      "email": "maria.silva@email.com",
      "phone": "+55 11 98765-4321",
      "headline": "Desenvolvedora Full Stack Plena",
      "city": "São Paulo",
      "country": "Brasil",
      "skills": [
        "Node.js",
        "TypeScript",
        "React",
        "PostgreSQL",
        "Redis"
      ],
      "isBlocked": false,
      "createdAt": "2026-09-11T01:19:59.812+00:00",
      "atsTags": []
    }
  ]
}

422 Unprocessable Entity

Ocorre quando os parâmetros de paginação ou ordenação são inválidos.

Listar Candidatos (Lista Simples) ​

Retorna os candidatos em formato simplificado (value/label), ideal para selects no frontend. Limitado a 500 itens, ordenado por nome.

http
GET /v1/ats/user/candidates/list

Parâmetros de Query ​

NomeTipoObrigatórioDescrição
searchstringNãoBusca por termo no nome, sobrenome ou e-mail (máx. 150 caracteres).

Exemplo de Requisição ​

bash
curl -X GET "https://api.us.basis.tavares.in/v1/ats/user/candidates/list?search=Maria" \
  -H "X-Ats-Id: 3fa85f64-5717-4562-b3fc-2c963f66afa6" \
  -H "Authorization: Bearer {token}" \
  -H "Accept: application/json"

Respostas ​

200 OK

Retorna um array com os candidatos em formato value/label.

json
[
  {
    "value": 1,
    "label": "Maria Silva"
  }
]

Obter Candidato por ID ​

Recupera o perfil completo de um candidato, incluindo experiências, formação, links, tags, arquivos enviados e todas as suas candidaturas (com a vaga e a etapa atual de cada uma).

http
GET /v1/ats/user/candidates/:id

Parâmetros de Rota ​

NomeTipoObrigatórioDescrição
idnumberSimO ID do candidato.

Exemplo de Requisição ​

bash
curl -X GET "https://api.us.basis.tavares.in/v1/ats/user/candidates/1" \
  -H "X-Ats-Id: 3fa85f64-5717-4562-b3fc-2c963f66afa6" \
  -H "Authorization: Bearer {token}" \
  -H "Accept: application/json"

Respostas ​

200 OK

Retorna o perfil completo do candidato com atsTags, atsFiles e atsApplications.

json
{
  "id": 1,
  "atsId": 1,
  "firstName": "Maria",
  "lastName": "Silva",
  "email": "maria.silva@email.com",
  "phone": "+55 11 98765-4321",
  "lastIp": null,
  "lastLoginAt": null,
  "headline": "Desenvolvedora Full Stack Plena",
  "summary": "Desenvolvedora full stack com 5 anos de experiência em Node.js, TypeScript e React.",
  "city": "São Paulo",
  "country": "Brasil",
  "timezone": "America/Sao_Paulo",
  "skills": [
    "Node.js",
    "TypeScript",
    "React",
    "PostgreSQL",
    "Redis"
  ],
  "experiences": [
    {
      "title": "Desenvolvedora Full Stack Plena",
      "company": "Tech Corp",
      "current": true,
      "endDate": null,
      "startDate": "2022-03",
      "description": "Desenvolvimento de APIs REST e interfaces web para o produto principal da empresa."
    }
  ],
  "educations": [
    {
      "degree": "Bacharelado em Ciência da Computação",
      "endDate": "2019-12",
      "startDate": "2016-02",
      "institution": "Universidade de São Paulo"
    }
  ],
  "links": {
    "github": "https://github.com/mariasilva",
    "linkedin": "https://www.linkedin.com/in/maria-silva"
  },
  "resumeText": null,
  "isBlocked": false,
  "consentAt": "2026-09-11T02:34:31.598+00:00",
  "consentSource": "job_board",
  "purgeAfterAt": null,
  "createdAt": "2026-09-11T01:19:59.812+00:00",
  "updatedAt": "2026-09-11T02:34:31.603+00:00",
  "atsFiles": [
    {
      "id": 1,
      "name": "curriculo.pdf",
      "extension": "pdf",
      "size": 115579,
      "mime": "application/pdf",
      "url": "https://s3.sa-east-1.amazonaws.com/tavares-dev/files/7af7ff84-4b0e-4ee8-becb-308d88dc7997.pdf",
      "createdAt": "2026-09-11T01:28:40.053+00:00",
      "atsCandidateId": 1
    }
  ],
  "atsTags": [],
  "atsApplications": [
    {
      "id": 1,
      "atsJobId": 1,
      "atsStageId": 1,
      "atsCandidateId": 1,
      "status": "withdrawn",
      "appliedAt": "2026-09-11T02:34:31.641+00:00",
      "createdAt": "2026-09-11T02:34:31.648+00:00",
      "atsStage": {
        "id": 1,
        "name": "New"
      },
      "atsJob": {
        "id": 1,
        "title": "Desenvolvedor Full Stack Pleno"
      }
    }
  ]
}

404 Not Found

Ocorre quando o candidato não existe na instância.

Atualizar Candidato ​

Atualiza o perfil de um candidato. Use tagIds para sincronizar as tags vinculadas (a lista enviada substitui completamente a anterior) e isBlocked para bloquear ou desbloquear o candidato.

Todos os campos são opcionais; envie apenas o que deseja alterar. Usuários com papel viewer em todas as empresas não podem executar esta ação.

http
PUT /v1/ats/user/candidates/:id

Parâmetros de Rota ​

NomeTipoObrigatórioDescrição
idnumberSimO ID do candidato.

Payload (Body) ​

AtributoTipoObrigatórioDescrição
skillsarrayNãoLista de habilidades do candidato (array de strings).
headlinestringNãoTítulo profissional (máx. 200 caracteres).
summarystringNãoResumo profissional (máx. 5000 caracteres).
citystringNãoCidade (máx. 100 caracteres).
countrystringNãoPaís (máx. 100 caracteres).
isBlockedbooleanNãoBloqueia (true) ou desbloqueia (false) o candidato.
tagIdsarrayNãoIDs das tags a vincular (devem existir na instância). Substitui as tags atuais.

Exemplo de Requisição ​

bash
curl -X PUT "https://api.us.basis.tavares.in/v1/ats/user/candidates/1" \
  -H "X-Ats-Id: 3fa85f64-5717-4562-b3fc-2c963f66afa6" \
  -H "Authorization: Bearer {token}" \
  -H "Content-Type: application/json" \
  -d '{
    "headline": "Desenvolvedora Full Stack Plena",
    "summary": "Profissional com 5 anos de experiência em desenvolvimento web, atuando com Node.js, TypeScript e React.",
    "city": "São Paulo",
    "country": "Brasil",
    "skills": ["Node.js", "TypeScript", "React", "PostgreSQL"],
    "isBlocked": false,
    "tagIds": [1]
  }'

Respostas ​

204 No Content

Atualização concluída com sucesso.

403 Forbidden

Ocorre quando o usuário autenticado não tem permissão para gerenciar candidatos (papel viewer em todas as empresas).

json
{
  "message": "Você não tem permissão para gerenciar este recurso",
  "code": "FORBIDDEN"
}

404 Not Found

Ocorre quando o candidato não existe na instância.

422 Unprocessable Entity

Erro de validação nos campos enviados — por exemplo, um tagIds com tag inexistente ou de outra instância.

json
{
  "errors": [
    {
      "message": "The tagIds.0 field must exist",
      "rule": "database.exists",
      "field": "tagIds.0"
    }
  ]
}