Appearance
Vagas
As vagas são o coração do ATS: cada vaga representa uma posição aberta na empresa e concentra a descrição do cargo, requisitos, benefícios, faixa salarial e o pipeline por onde os candidatos vão fluir. Toda vaga nasce como rascunho (draft) e só aparece no job board público quando é publicada.
Além dos dados da vaga em si, é possível configurar perguntas personalizadas que o candidato responde no momento da candidatura — incluindo perguntas eliminatórias (knockout), que filtram automaticamente quem não atende aos requisitos mínimos.
Headers obrigatórios
Todas as requisições devem incluir o header X-Ats-Id (UUID) com o identificador da instância ATS, além de Authorization: Bearer {token} com o token de um usuário staff (guard atsUser).
Estrutura de Dados Principal
Uma vaga contém as seguintes informações principais:
| Campo | Tipo | Descrição |
|---|---|---|
code | String | Código interno da vaga (ex.: REQ-2026-001). |
title | String | Título da vaga (máx. 200 caracteres). O slug é gerado automaticamente a partir dele. |
description | String | Descrição completa da vaga (suporta Markdown). |
requirements | String | Requisitos do cargo. |
benefits | String | Benefícios oferecidos. |
status | Enum | draft, open, paused, closed ou archived. |
employmentType | Enum | full_time, part_time, contract, temporary, internship, freelance ou apprenticeship. |
workplaceType | Enum | onsite, hybrid ou remote. |
seniority | Enum | intern, junior, mid, senior, lead, manager, director ou executive. |
openings | Number | Quantidade de posições abertas (padrão: 1). |
salaryMin / salaryMax | String | Faixa salarial (valores decimais retornados como string, ex.: "8000.00"). |
salaryCurrency | String | Moeda do salário (código ISO de 3 letras, ex.: BRL). |
salaryPeriod | Enum | Periodicidade do salário: hour, day, week, month ou year. |
salaryIsPublic | Boolean | Quando false (padrão), o salário não é exibido no job board público. |
publishedAt | DateTime | Preenchido automaticamente na primeira publicação. |
closesAt | DateTime | Data limite para candidaturas. |
closedAt | DateTime | Preenchido automaticamente ao fechar a vaga; limpo ao reabrir. |
metadata | Object | Dados livres em formato JSON. |
Gerenciamento de Vagas
Listar Vagas
Lista as vagas da instância com paginação, busca full-text e filtros. A busca por search percorre título, requisitos e descrição e não diferencia acentos — buscar por Engenheiro também encontra "Engenhéiro".
http
GET /v1/ats/user/jobsParâmetros de Query
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
page | number | Não | O número da página (mínimo: 1). |
perPage | number | Não | Itens por página (entre 1 e 100, padrão: 25). |
search | string | Não | Busca full-text em título, requisitos e descrição (máx. 150 caracteres). |
orderBy | enum | Não | Ordena por id, title, createdAt ou publishedAt. |
orderDirection | enum | Não | Direção da ordenação: asc ou desc. |
status | enum | Não | Filtra por draft, open, paused, closed ou archived. |
atsCompanyId | number | Não | Filtra por empresa. |
atsDepartmentId | number | Não | Filtra por departamento. |
atsLocationId | number | Não | Filtra por localidade. |
workplaceType | enum | Não | Filtra por onsite, hybrid ou remote. |
employmentType | enum | Não | Filtra pelo tipo de contratação. |
seniority | enum | Não | Filtra pelo nível de senioridade. |
Exemplo de Requisição
bash
curl -X GET "https://api.us.basis.tavares.in/v1/ats/user/jobs?status=open&workplaceType=remote" \
-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 vagas.
json
{
"meta": {
"currentPage": 1,
"perPage": 25
},
"data": [
{
"id": 1,
"atsId": 1,
"atsCompanyId": 1,
"atsPipelineId": 1,
"atsDepartmentId": 1,
"atsLocationId": 1,
"atsUserId": 1,
"atsHiringUserId": 1,
"code": "REQ-2026-001",
"title": "Desenvolvedor Full Stack Pleno",
"slug": "desenvolvedor-full-stack-pleno",
"status": "draft",
"employmentType": "full_time",
"workplaceType": "hybrid",
"seniority": "mid",
"openings": 2,
"salaryMin": "8000.00",
"salaryMax": "12000.00",
"salaryCurrency": "BRL",
"salaryPeriod": "month",
"salaryIsPublic": true,
"publishedAt": null,
"closesAt": "2026-10-15T00:00:00.000Z",
"closedAt": null,
"createdAt": "2026-09-10T16:08:24.207+00:00",
"updatedAt": "2026-09-10T16:08:24.207+00:00",
"atsDepartment": {
"id": 1,
"name": "I.T"
},
"atsCompany": {
"id": 1,
"name": "Catho"
},
"atsPipeline": {
"id": 1,
"name": "Default"
},
"atsLocation": {
"id": 1,
"name": "Av. Dr. Luís Rocha Miranda"
}
}
]
}Listar Vagas (Lista Simples)
Retorna as vagas em formato simplificado (label/value), ideal para selects e filtros no frontend.
http
GET /v1/ats/user/jobs/listParâmetros de Query
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
search | string | Não | Busca por termo no título (máx. 150 caracteres). |
status | enum | Não | Filtra por draft, open, paused, closed ou archived. |
Exemplo de Requisição
bash
curl -X GET "https://api.us.basis.tavares.in/v1/ats/user/jobs/list?status=open" \
-H "X-Ats-Id: 3fa85f64-5717-4562-b3fc-2c963f66afa6" \
-H "Authorization: Bearer {token}" \
-H "Accept: application/json"Respostas
200 OK
Retorna um array com as vagas em formato label/value.
json
[
{
"value": 1,
"label": "Desenvolvedor Full Stack Pleno"
}
]Criar Vaga
Cria uma nova vaga. Toda vaga é criada com status draft e o slug é gerado automaticamente a partir do título.
http
POST /v1/ats/user/jobsPayload (Body)
| Atributo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
code | string | Não | Código interno da vaga (máx. 40 caracteres). |
title | string | Sim | Título da vaga (máx. 200 caracteres). |
description | string | Sim | Descrição completa da vaga. |
requirements | string | Não | Requisitos do cargo. |
benefits | string | Não | Benefícios oferecidos. |
employmentType | enum | Não | Tipo de contratação (ver enums acima). |
workplaceType | enum | Não | Modelo de trabalho: onsite, hybrid ou remote. |
seniority | enum | Não | Nível de senioridade. |
openings | number | Não | Quantidade de posições (mínimo: 1). |
salaryMin | number | Não | Salário mínimo. |
salaryMax | number | Não | Salário máximo. |
salaryCurrency | string | Não | Moeda (3 letras, ex.: BRL). |
salaryPeriod | enum | Não | hour, day, week, month ou year. |
salaryIsPublic | boolean | Não | Exibe o salário no job board público (padrão: false). |
closesAt | date | Não | Data limite para candidaturas. |
atsCompanyId | number | Sim | ID da empresa (deve existir na instância). |
atsPipelineId | number | Sim | ID do pipeline (deve existir na instância). |
atsDepartmentId | number | Não | ID do departamento (deve existir na instância). |
atsLocationId | number | Não | ID da localidade (deve existir na instância). |
atsUserId | number | Não | ID do usuário responsável pela vaga. |
atsHiringUserId | number | Não | ID do hiring manager. |
metadata | object | Não | Dados livres em formato JSON. |
Exemplo de Requisição
bash
curl -X POST "https://api.us.basis.tavares.in/v1/ats/user/jobs" \
-H "X-Ats-Id: 3fa85f64-5717-4562-b3fc-2c963f66afa6" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"code": "REQ-2026-001",
"title": "Desenvolvedor Full Stack Pleno",
"description": "## Sobre a vaga\n\nBuscamos um desenvolvedor full stack para atuar no produto principal da empresa.",
"requirements": "- Experiência sólida com Node.js e TypeScript\n- Vivência com PostgreSQL e Redis",
"benefits": "- Vale-refeição de R$ 880\n- Plano de saúde e odontológico",
"employmentType": "full_time",
"workplaceType": "hybrid",
"seniority": "mid",
"openings": 2,
"salaryMin": 8000,
"salaryMax": 12000,
"salaryCurrency": "BRL",
"salaryPeriod": "month",
"salaryIsPublic": true,
"closesAt": "2026-10-15",
"atsCompanyId": 1,
"atsPipelineId": 1,
"atsDepartmentId": 1,
"atsLocationId": 1
}'Respostas
201 Created
Retorna o ID da vaga criada.
json
{
"id": 1
}422 Unprocessable Entity
Erro de validação nos campos enviados.
json
{
"errors": [
{
"message": "Título é obrigatório",
"rule": "required",
"field": "title"
}
]
}Obter Vaga por ID
Recupera os detalhes completos de uma vaga, incluindo empresa, departamento, localidade, pipeline, responsáveis e as perguntas configuradas (atsJobQuestions).
http
GET /v1/ats/user/jobs/:idParâmetros de Rota
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id | number | Sim | O ID da vaga. |
Exemplo de Requisição
bash
curl -X GET "https://api.us.basis.tavares.in/v1/ats/user/jobs/1" \
-H "X-Ats-Id: 3fa85f64-5717-4562-b3fc-2c963f66afa6" \
-H "Authorization: Bearer {token}" \
-H "Accept: application/json"Respostas
200 OK
Retorna a vaga com seus relacionamentos e perguntas.
json
{
"id": 1,
"atsId": 1,
"atsCompanyId": 1,
"atsPipelineId": 1,
"atsDepartmentId": 1,
"atsLocationId": 1,
"atsUserId": 1,
"atsHiringUserId": 1,
"code": "REQ-2026-001",
"title": "Desenvolvedor Full Stack Pleno",
"slug": "desenvolvedor-full-stack-pleno",
"description": "## Sobre a vaga\n\nBuscamos um desenvolvedor full stack para atuar no produto principal da empresa.",
"requirements": "- Experiência sólida com Node.js e TypeScript\n- Vivência com PostgreSQL e Redis",
"benefits": "- Vale-refeição de R$ 880\n- Plano de saúde e odontológico",
"status": "draft",
"employmentType": "full_time",
"workplaceType": "hybrid",
"seniority": "mid",
"openings": 2,
"salaryMin": "8000.00",
"salaryMax": "12000.00",
"salaryCurrency": "BRL",
"salaryPeriod": "month",
"salaryIsPublic": true,
"metadata": {
"area": "Engenharia",
"prioridade": "alta"
},
"publishedAt": null,
"closesAt": "2026-10-15T00:00:00.000Z",
"closedAt": null,
"createdAt": "2026-09-10T16:08:24.207+00:00",
"updatedAt": "2026-09-10T16:08:24.207+00:00",
"atsCompany": {
"id": 1,
"name": "Catho"
},
"atsLocation": {
"id": 1,
"name": "Av. Dr. Luís Rocha Miranda"
},
"atsPipeline": {
"id": 1,
"name": "Default"
},
"atsUser": {
"id": 1,
"firstName": "Gerson",
"lastName": "Tavares",
"email": "gerson_tavares@live.com"
},
"atsHiringUser": {
"id": 1,
"firstName": "Gerson",
"lastName": "Tavares",
"email": "gerson_tavares@live.com"
},
"atsJobQuestions": [],
"atsDepartment": {
"id": 1,
"name": "I.T"
}
}404 Not Found
Ocorre quando a vaga não existe na instância.
Atualizar Vaga
Atualiza os dados de uma vaga existente. Se o título for alterado, o slug é regenerado automaticamente.
http
PUT /v1/ats/user/jobs/:idParâmetros de Rota
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id | number | Sim | O ID da vaga. |
Payload (Body)
Aceita os mesmos campos da criação, todos opcionais — envie apenas o que deseja alterar.
Exemplo de Requisição
bash
curl -X PUT "https://api.us.basis.tavares.in/v1/ats/user/jobs/1" \
-H "X-Ats-Id: 3fa85f64-5717-4562-b3fc-2c963f66afa6" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"title": "Desenvolvedor Full Stack Sênior",
"seniority": "senior",
"salaryMin": 12000,
"salaryMax": 18000
}'Respostas
204 No Content
Atualização concluída com sucesso.
404 Not Found
Ocorre quando a vaga não existe na instância.
Alterar Status da Vaga
Altera o status da vaga, controlando sua visibilidade no job board. O ciclo de status é: draft → open → paused → closed → archived.
As datas de publicação e fechamento são gerenciadas automaticamente:
- Ao sair de
draftpela primeira vez,publishedAté preenchido com a data atual; - Ao mudar para
closed,closedAté preenchido; - Ao reabrir uma vaga fechada (
openoupaused),closedAté limpo.
http
PATCH /v1/ats/user/jobs/:id/statusParâmetros de Rota
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id | number | Sim | O ID da vaga. |
Payload (Body)
| Atributo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
status | enum | Sim | Novo status: draft, open, paused, closed ou archived. |
Exemplo de Requisição
bash
curl -X PATCH "https://api.us.basis.tavares.in/v1/ats/user/jobs/1/status" \
-H "X-Ats-Id: 3fa85f64-5717-4562-b3fc-2c963f66afa6" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"status": "open"
}'Respostas
204 No Content
Status alterado com sucesso.
422 Unprocessable Entity
Erro de validação — o status informado não é um valor válido.
json
{
"errors": [
{
"message": "Status inválido",
"rule": "enum",
"field": "status"
}
]
}Remover Vaga
Exclui uma vaga da instância.
http
DELETE /v1/ats/user/jobs/:idParâmetros de Rota
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id | number | Sim | O ID da vaga. |
Exemplo de Requisição
bash
curl -X DELETE "https://api.us.basis.tavares.in/v1/ats/user/jobs/1" \
-H "X-Ats-Id: 3fa85f64-5717-4562-b3fc-2c963f66afa6" \
-H "Authorization: Bearer {token}"Respostas
204 No Content
Remoção concluída com sucesso.
404 Not Found
Ocorre quando a vaga não existe na instância.
Perguntas da Vaga
Cada vaga pode ter perguntas personalizadas que o candidato responde ao se candidatar no job board. As perguntas são exibidas na ordem definida pelo campo position e suportam diferentes tipos de resposta:
| Tipo | Descrição |
|---|---|
short_text | Texto curto (uma linha). |
long_text | Texto longo (múltiplas linhas). |
single_choice | Escolha única entre as options. |
multi_choice | Múltipla escolha entre as options. |
boolean | Sim ou não. |
number | Valor numérico. |
date | Data. |
file | Upload de arquivo. |
url | Endereço web (ex.: link de portfólio). |
Perguntas eliminatórias (knockout)
O campo knockout define a resposta que elimina automaticamente o candidato — por exemplo, { "operator": "equals", "value": "Não" } em uma pergunta booleana. Essa configuração é interna do processo seletivo e nunca é exposta publicamente no job board: o candidato não sabe qual resposta o eliminaria.
Listar Perguntas
Lista as perguntas de uma vaga, ordenadas por position.
http
GET /v1/ats/user/jobs/:jobId/questionsParâmetros de Rota
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
jobId | number | Sim | O ID da vaga. |
Exemplo de Requisição
bash
curl -X GET "https://api.us.basis.tavares.in/v1/ats/user/jobs/1/questions" \
-H "X-Ats-Id: 3fa85f64-5717-4562-b3fc-2c963f66afa6" \
-H "Authorization: Bearer {token}" \
-H "Accept: application/json"Respostas
200 OK
Retorna um array com as perguntas da vaga.
json
[
{
"id": 1,
"atsId": 1,
"atsJobId": 1,
"label": "Você tem experiência com TypeScript?",
"helpText": "Considere experiência profissional ou em projetos pessoais relevantes.",
"type": "single_choice",
"options": [
"Sim, mais de 3 anos",
"Sim, entre 1 e 3 anos",
"Não, mas tenho interesse"
],
"isRequired": true,
"knockout": {
"value": "Sim, mais de 3 anos",
"operator": "equals"
},
"position": 1,
"createdAt": "2026-09-11T02:28:28.396+00:00",
"updatedAt": "2026-09-11T02:28:28.396+00:00"
}
]Criar Pergunta
Adiciona uma nova pergunta à vaga.
http
POST /v1/ats/user/jobs/:jobId/questionsParâmetros de Rota
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
jobId | number | Sim | O ID da vaga. |
Payload (Body)
| Atributo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
label | string | Sim | Texto da pergunta (máx. 250 caracteres). |
helpText | string | Não | Texto de ajuda exibido ao candidato (máx. 500 caracteres). |
type | enum | Sim | Tipo da resposta (ver tabela de tipos acima). |
options | string[] | Não | Opções de resposta (para single_choice e multi_choice). |
isRequired | boolean | Não | Indica se a resposta é obrigatória. |
knockout | object | Não | Resposta eliminatória, ex.: { "operator": "equals", "value": "..." }. |
position | number | Não | Posição de exibição (mínimo: 0). |
Exemplo de Requisição
bash
curl -X POST "https://api.us.basis.tavares.in/v1/ats/user/jobs/1/questions" \
-H "X-Ats-Id: 3fa85f64-5717-4562-b3fc-2c963f66afa6" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"label": "Você tem experiência com TypeScript?",
"helpText": "Considere experiência profissional ou em projetos pessoais relevantes.",
"type": "single_choice",
"options": ["Sim, mais de 3 anos", "Sim, entre 1 e 3 anos", "Não, mas tenho interesse"],
"isRequired": true,
"knockout": {
"operator": "equals",
"value": "Sim, mais de 3 anos"
},
"position": 1
}'Respostas
201 Created
Retorna o ID da pergunta criada.
json
{
"id": 1
}422 Unprocessable Entity
Erro de validação nos campos enviados.
json
{
"errors": [
{
"message": "Rótulo é obrigatório",
"rule": "required",
"field": "label"
}
]
}Atualizar Pergunta
Atualiza uma pergunta existente, incluindo sua posição na ordenação.
http
PUT /v1/ats/user/jobs/:jobId/questions/:idParâmetros de Rota
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
jobId | number | Sim | O ID da vaga. |
id | number | Sim | O ID da pergunta. |
Payload (Body)
Aceita os mesmos campos da criação, todos opcionais — envie apenas o que deseja alterar.
Exemplo de Requisição
bash
curl -X PUT "https://api.us.basis.tavares.in/v1/ats/user/jobs/1/questions/1" \
-H "X-Ats-Id: 3fa85f64-5717-4562-b3fc-2c963f66afa6" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"label": "Qual sua experiência com TypeScript?",
"isRequired": true,
"position": 2
}'Respostas
204 No Content
Atualização concluída com sucesso.
404 Not Found
Ocorre quando a vaga ou a pergunta não existe na instância.
Remover Pergunta
Remove uma pergunta da vaga.
http
DELETE /v1/ats/user/jobs/:jobId/questions/:idParâmetros de Rota
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
jobId | number | Sim | O ID da vaga. |
id | number | Sim | O ID da pergunta. |
Exemplo de Requisição
bash
curl -X DELETE "https://api.us.basis.tavares.in/v1/ats/user/jobs/1/questions/1" \
-H "X-Ats-Id: 3fa85f64-5717-4562-b3fc-2c963f66afa6" \
-H "Authorization: Bearer {token}"Respostas
204 No Content
Remoção concluída com sucesso.
404 Not Found
Ocorre quando a vaga ou a pergunta não existe na instância.