Abrir vagas e mover candidatos pela API
A vaga nasce no seu quadro de posições ou no ERP, quando uma requisição de pessoal é aprovada. Pela API, o seu sistema abre a vaga na TAI já com a posição (empresa, departamento, cargo), ajusta as etapas do processo seletivo e acompanha — ou conduz — o candidato de etapa em etapa.
| Quando usar | Requisição de vaga aprovada em outro sistema; ATS externo que conduz o funil e espelha na TAI |
| Porta | REST · Webhook · Agente (MCP) para criar vaga e mover candidato |
| Você vai precisar | módulo CONTRATACOES; permissão VAGA (edição) para vagas e etapas; CANDIDATO (edição) para mover e reprovar; JWT de um usuário de integração |
Como funciona
Seção intitulada “Como funciona”seu sistema ──► POST /vaga {modeloNome?} vaga em RASCUNHO + etapas do modelo de processo ──► GET/PATCH /etapa-processo ajusta as etapas (prazo, tipo, nome) ──► PUT /ats-pergunta/vaga/{id} perguntas do formulário de candidatura ──► POST /vaga/{id}/publicar PUBLICADA · ganha urlPublica · VAGA_PUBLICADA │ candidaturas chegam (portal, site, hunting) na 1ª etapa · CANDIDATURA_CRIADA │ ──► POST /candidatura/{id}/mover-etapa?etapaId=… CANDIDATURA_MOVIDA_ETAPA ──► POST /candidatura/{id}/reprovar {motivo…} CANDIDATURA_REPROVADA ──► POST /candidatura/{id}/contratar {…} CANDIDATURA_CONTRATADA + admissão ──► POST /vaga/{id}/encerrar {situacao, motivo…} VAGA_FECHADAPasso a passo
Seção intitulada “Passo a passo”-
Crie a vaga.
Terminal window curl -X POST https://api.taitecnologia.com/vaga \-H "Authorization: Bearer $TAI_TOKEN" \-H "Content-Type: application/json" \-d '{"titulo": "Analista Financeiro","descricao": "Contas a pagar e a receber, conciliação bancária e fechamento mensal.","requisitosObrigatorios": "Superior em Administração, Contábeis ou Economia.","tipoContratacao": "CLT","modalidadeTrabalho": "HIBRIDO","localizacao": "Belo Horizonte - MG","faixaSalarial": "R$ 5.000 a R$ 6.500","empresa": { "id": 3 },"departamento": { "id": 40 },"cargo": { "id": 77 },"codigoPosicao": "POS-118","modeloNome": "Financeiro","recrutadorResponsavel": { "id": 1043 },"gestorResponsavel": { "id": 1021 }}'A vaga nasce em
RASCUNHO. Guarde oide, se quiser, grave ocodigoPosicaodo seu quadro — ele serve de chave de correspondência. Os ids de empresa, departamento, time (subDepartamento), cargo e centro de custo precisam existir na conta, e o time precisa ser do departamento informado.modeloId(deGET /ats-modelo-processo) oumodeloNomeescolhe o modelo de processo de que a vaga copia as etapas; sem ele, vale o modelo padrão da empresa. A vaga também nasce com as perguntas padrão da empresa. Vaga afirmativa:vagaAfirmativa(NAO,EXCLUSIVA_PCD,PREFERENCIAL_PCD,OUTRA+vagaAfirmativaTexto) eoferecerAutodeclaracaoPcd.A posição (empresa, departamento, time, cargo, centro de custo, código) não aparece no anúncio: ela preenche o vínculo do colaborador quando a admissão do aprovado for finalizada.
-
Confira as etapas. A vaga nasce com as etapas do modelo (o modelo padrão de cada empresa começa com Triagem, Entrevista RH, Entrevista Técnica, Entrevista Gestor e Proposta). Cada etapa traz
prazoDiasUteis(vencido, a pessoa leva o selo de parada) etipo(NORMALouAPROVACAO_GESTOR).Terminal window curl https://api.taitecnologia.com/etapa-processo/vaga/512 \-H "Authorization: Bearer $TAI_TOKEN"Para acrescentar uma etapa:
POST /etapa-processoContent-Type: application/json{ "vagaId": 512, "nome": "Teste prático", "prazoDiasUteis": 3 }Sem
ordem, a etapa entra no fim. Para reordenar,POST /etapa-processo/vaga/{vagaId}/ordemcom{"etapaIds": [...]}(todas, na ordem nova). Para mudar uma etapa,PATCH /etapa-processocom oide só o que muda (prazoDiasUteis: 0enomePublico: ""limpam). Candidaturas novas entram na etapa deordem1.Remover etapa com gente exige destino:
DELETE /etapa-processo/{id}só remove etapa vazia; com pessoas, usePOST /etapa-processo/{id}/removercom{"destinoEtapaId": …}. Para trocar o processo inteiro pelo de um modelo,GET /vaga/{id}/previa-modelo?modeloId=…mostra o que fica, entra e sai (e quantas pessoas estão em cada etapa que sai), ePOST /vaga/{id}/aplicar-modelo?modeloId=…aplica, com{"destinos": [{"etapaId": …, "destino": "nome da etapa do modelo"}]}para cada etapa que sai com gente. Ninguém é avisado.Perguntas da candidatura:
GET /ats-pergunta/vaga/{vagaId}ePUT /ats-pergunta/vaga/{vagaId}com{"perguntas": [...]}(a lista inteira, na ordem). TiposSIM_NAO,ESCOLHA(opcoes),TEXTO,NUMERO,PRETENSAO_SALARIAL,DISPONIBILIDADE;eliminatoria+respostaEsperadasó emSIM_NAOeESCOLHA. Eliminatória não reprova: marcanaoAtendena lista de candidatos. -
Publique.
POST /vaga/512/publicarPublicar exige
titulo,descricao,tipoContratacaoemodalidadeTrabalho(sem eles,400com o campo que falta). A vaga passa aPUBLICADA, ganha aurlPublicae entra no portal de carreiras e nas rotas públicas, e a TAI publica Uma vaga é publicada (VAGA_PUBLICADA).POST /vaga/{id}/pausar(corpo opcional{"observacao": "…"}) tira do ar e publica Uma vaga é pausada (VAGA_PAUSADA);POST /vaga/{id}/retomardevolve ao portal com o mesmo link (VAGA_RETOMADA). -
Mova candidatos. Liste as candidaturas da vaga (
GET /candidatura/vaga/{vagaId}) e mova:Terminal window curl -X POST "https://api.taitecnologia.com/candidatura/9412/mover-etapa?etapaId=2309&enviarNotificacao=true" \-H "Authorization: Bearer $TAI_TOKEN"etapaIdé obrigatório e tem de ser da mesma vaga;enviarNotificacao=truepõe o e-mail da mudança de etapa na fila de envio (o padrão é não mandar;atrasoMinutosopcional) e a resposta trazemailNaFilacom o horário. Cada movimento publica Um candidato muda de etapa (CANDIDATURA_MOVIDA_ETAPA). Só candidatura ativa (semdesfecho) se move.Para reprovar, mande o corpo:
POST /candidatura/9412/reprovar{ "motivo": "Perfil técnico", "observacao": "sem SQL avançado", "enviarEmail": true }motivoé o nome de um motivo da empresa (lista emGET /ats-motivo/tipo/REPROVACAO) ou usemotivoId; nome desconhecido vira “Outro” com o texto como observação. A candidatura ganhadesfecho: "REPROVADA"e sai das etapas; o feedback entra na fila com o atraso de reprovação da empresa. Publica Um candidato é reprovado (CANDIDATURA_REPROVADA). A chamada antiga?motivo=…&enviarNotificacao=…continua aceita. Desistência do candidato é outra ação:POST /candidatura/{id}/registrar-desistencia(CANDIDATURA_DESISTIU). Para desfazer qualquer desfecho:POST /candidatura/{id}/reverter-desfecho(CANDIDATURA_REABERTA), que também tira da fila os e-mails que ainda não saíram. -
Encerre a vaga.
POST /vaga/512/encerrar{ "situacao": "FECHADA_PREENCHIDA", "motivo": "Posições preenchidas", "avisarCandidatos": true }situacaoaceitaFECHADA_PREENCHIDAouFECHADA_CANCELADA; o motivo vem deGET /ats-motivo/tipo/ENCERRAMENTO_VAGA. Quem ainda estava no processo ganhadesfecho: "ENCERRADA_COM_VAGA"e, comavisarCandidatos(padrãotrue), recebe o aviso pela fila de envio. A TAI publica Uma vaga é fechada (VAGA_FECHADA). A chamada antigaPOST /vaga/{id}/fechar?statusFechamento=…continua aceita: encerra sem motivo e sem avisar.
Automatize
Seção intitulada “Automatize”O que a TAI já faz sozinha neste cenário:
- Pré-entrevista automática (
ats-pre-entrevista-automatica, começa ligada). Numa etapa marcada com Pré-entrevista (na vaga, aba Configurar › Processo, ou no modelo de processo), a pré-entrevista por WhatsApp começa quando o candidato entra nela — inclusive quando quem move é a sua integração, pormover-etapa. Se não der (candidato sem telefone, WhatsApp não configurado na empresa), o motivo fica nos comentários da candidatura. Editar a etapa pela API (nome, ordem) não desfaz essa marcação. - Vaga sem candidaturas (
ats-funil-parado, começa desligada). Toda segunda de manhã, avisa por e-mail o recrutador da vaga publicada que passou uma semana sem candidatura nova. Ligue em Processos › Central de Automações › Rotinas dos módulos.
Devolver o andamento ao quadro de posições. Quando a vaga nasce no seu sistema, ele fica
sabendo do que acontece com ela por um webhook que assine Uma vaga é
publicada (VAGA_PUBLICADA), Uma vaga é fechada (VAGA_FECHADA) e Um candidato é contratado
(CANDIDATURA_CONTRATADA):
{ "id": "evt_56488", "tipo": "VAGA_FECHADA", "descricao": "Uma vaga é fechada", "versao": 1, "ocorridoEm": "2026-11-04T14:05:51.902Z", "empresa": { "id": 12, "nome": "Sua Empresa Ltda" }, "dados": { "vagaId": 512, "vagaTitulo": "Analista Financeiro", "situacao": "FECHADA_PREENCHIDA", "gestorResponsavelId": 1021, "recrutadorId": 1043 }}Case pelo vagaId que você guardou no passo 1 (ou leia o codigoPosicao em GET /vaga/{id}).
Para o andamento de cada candidato, veja
Candidaturas no seu sistema.
Pelo seu agente de IA
Seção intitulada “Pelo seu agente de IA”“Mova a Ana Ribeiro para Entrevista Gestor na vaga de Analista Financeiro e avise por e-mail.”
Com escopo de escrita, o agente acha a candidatura e a etapa e chama mover-etapa, com aprovação
no seu cliente de IA; criar vaga também. Publicar, fechar e reprovar não são executados pelo
MCP — são atos de confirmação forte, feitos na tela ou pela Tali.
Cuidados
Seção intitulada “Cuidados”- A etapa precisa ser da mesma vaga. Pegue o
etapaIdemGET /etapa-processo/vaga/{vagaId}da vaga da candidatura; etapa de outra vaga é recusada com400. - Etapa × desfecho.
etapaAtualdiz onde a pessoa está;desfecho(CONTRATADA,REPROVADA,DESISTIU,ENCERRADA_COM_VAGA) diz como terminou — vazio = ainda no processo.statusAtualé legado, derivado dos dois; não o use para decidir.PUT/PATCH /candidaturanão mudam etapa, status nem desfecho (400com a ação certa). - Quem está no processo, como a tela mostra.
GET /candidatura/vaga/{vagaId}/candidatosdevolve os ativos com etapa, dias na etapa,aderencia(0–100, comaderenciaBaseCURRICULOouCOMPORTAMENTALeaderenciaConfianca; nula = não medida) e selos (semDecisao,paradaDias,propostaSituacao…). Filtrosetapa(nome) ouetapaId,semDecisao,aderenciaMin,aderenciaMax(abaixo de),origem,naoAtende(true= respondeu fora do esperado a uma eliminatória;false= atende),busca;ordenar,pagina,tamanho(até 1000).etapastraz, por etapa,doFiltroetotal. - Várias pessoas de uma vez.
POST /candidatura/vaga/{vagaId}/mover-varias(corpoetapaId) e.../reprovar-varias(corpo como o dereprovar) recebem a seleção na query:idse/ou os mesmos filtros da lista, maisconfirmarTotal(obrigatório com filtro; diferente do total atual =409). Consulte antesGET /candidatura/vaga/{vagaId}/previa-lotecom a mesma query. Até 300 pessoas por chamada. Cada pessoa é tratada à parte eitensdiz quem ficou de fora e por quê. Seleção pela aderência é recusada para token de integração: a nota é calculada por IA, e esse lote só é confirmado por uma pessoa na tela ou na Tali. Pelo MCP, as ações em lote não são executadas (são de confirmação forte). - Impressão da equipe.
POST /candidatura/{id}/avaliarcom{"nota": 1-5}grava a impressão de quem chama (uma por pessoa; de novo substitui) e publica Um candidato recebe uma impressão (CANDIDATURA_AVALIADA). - Nenhum e-mail ao candidato sai na hora. Ele entra na fila (
GET /ats-email-fila) com o horário de envio;POST /ats-email-fila/{id}/retirarcancela enquanto não saiu. O atraso é da empresa (GET/PUT /ats-configuracao); sem configuração, sai no minuto seguinte. - Para mudar um ou dois campos da vaga, use
PATCH /vagacom oid: oPUTsubstitui o registro e apagariastatuseurlPublica. NoPATCH, um objeto semid("cargo": {}) limpa o vínculo e"codigoPosicao": ""limpa o código. urlPublicanasce na primeira publicação e não muda ao pausar e republicar: os links divulgados continuam valendo.- Corpo acima de 8 KB é recusado pelo firewall — descrições muito longas também contam. Veja Limites.
Referência gerada do contrato da API em 30 de outubro de 2026. taitecnologia.com · Termos de uso · Privacidade
© 2026 T AI TECNOLOGIA LTDA