API VagaFit
Hub de documentação para integrar o ATS VagaFit com Make, Zapier, n8n ou ferramentas próprias.
Base URL: https://vagafit.net
Visão geral
A API HTTP vive em /api/*. Esta página (/api) é só documentação;
as rotas de dados continuam em subpaths (/api/vagas, /api/colaboradores-internos/sync, etc.).
- JSON — request e response em
application/json(salvo uploads especiais). - CORS — origins permitidos:
vagafit.net, extensões Chrome e lista emVAGAFIT_ALLOWED_ORIGINS. Chamadas server-to-server (Make/Zapier) sem headerOriginfuncionam normalmente. - Cookies — APIs do dashboard usam sessão B2B (
HttpOnly) após login magic link / Google.
Autenticação
1. Sessão B2B (dashboard)
Login em /clientes (magic link ou Google). O cookie de sessão é enviado automaticamente em requests same-origin do dashboard. Em scripts externos, a sessão costuma não ser prática — use o sync secret ou webhooks.
GET /api/auth/session— status da sessãoPOST /api/auth/email— pede magic linkPOST /api/auth/logout— encerra sessão
2. Sync secret (Make / Zapier / HTTP)
Para POST …/colaboradores…/sync e POST …/sucessao/risco, autentique com o mesmo valor do
webhook_secret da organização (Configurações → Comunicação), em um destes formatos:
X-VagaFit-Sync-Secret: SEU_WEBHOOK_SECRET
Authorization: Bearer SEU_WEBHOOK_SECRET
Alternativa aceita: header X-VagaFit-Signature com o secret em texto puro
(não confundir com a assinatura HMAC dos webhooks outbound).
sync secret Configure o secret no dashboard; nunca o commite em repositórios públicos.
3. Assinatura de webhooks outbound
Quando o VagaFit envia eventos para a sua URL, o header
X-VagaFit-Signature é o HMAC-SHA256 do body JSON com o webhook_secret.
Detalhes em /docs/webhooks.
Webhooks outbound
Configure URL + secret em Comunicação → Webhooks outbound.
Cada evento é um POST JSON. Falhas ficam na aba Sheets EventosWebhook
(até 5 tentativas; o cron diário reprocessa pendentes).
Eventos principais:
candidatura.criadacandidatura.status_alterado(camposde,para)candidatura.contratada/candidatura.recusadacontratacao.payload_pdi— forças, gaps, PDI 90 dias +atribuicao_canalemail.enviado,entrevista.agendadawebhook.teste
Documentação completa (payloads, WhatsApp, portal): /docs/webhooks
APIs de sync / inbound
Rotas pensadas para integração externa (HRIS → VagaFit, Make, Zapier).
Alias estável. Também disponível em
POST /api/colaboradores-internos/sync (mesmo contrato).
Body:
{
"colaboradores": [
{
"nome": "Ana Silva",
"email": "ana@empresa.com",
"area": "Produto",
"senioridade": "Pleno",
"cargo_atual": "Product Analyst",
"departamento": "Produto",
"tempo_casa_meses": 18,
"tags": "sql, analytics",
"skills_texto": "SQL, Looker, discovery",
"avaliacao_resumo": "Forte em ownership",
"metas_resumo": "OKRs Q2"
}
],
"full_sync": false
}
colaboradores(ouemployees) — array obrigatório; máx. 2000 por request.email+nome— identificação / upsert.full_sync: true— colaboradores ausentes do lote podem ser marcados inativos (comportamento de sync completo).
Resposta (200): { ok, via: "secret"|"sessao", …contadores do upsert }
Sucessão — cargo crítico em risco (9-Box)
Quando Mereo (ou outro RH) sinaliza que uma liderança crítica pode ficar vaga, envie o alerta.
O VagaFit ranqueia o Banco de Talentos, abre uma vaga no Kanban e vincula os melhores perfis
(origem: sucessao). Sucessores internos (funcionários) usam
Mobilidade / sync de colaboradores.
Alias: POST /api/sucessao/risco e POST /api/sucessao/eventos (mesmo handler).
Body (exemplo Mereo / Make):
{
"source": "mereo",
"external_id": "mereo-role-123",
"event_type": "lideranca_critica_em_risco",
"cargo": {
"titulo": "Head de Produto",
"area": "Produto",
"senioridade": "Sênior",
"skills": ["product strategy", "OKRs", "liderança"],
"descricao": "Liderança do chapter de produto"
},
"titular": {
"nome": "João Silva",
"email": "joao@empresa.com",
"box_9": "alto_potencial",
"risco": "saida_iminente"
},
"min_score": 70,
"limite": 10,
"criar_vaga": true,
"vincular_matches": true
}
cargo.titulo— obrigatório.criterios[]— opcional; se omitido, monta a partir de area / senioridade / skills.external_id— idempotência: mesmo id não reabre outra vaga.dry_run: true— só retorna matches, sem persistir / abrir vaga.criar_vaga/vincular_matches— defaulttrue.
Resposta (201): evento, matches, vaga_id, lista vinculados.
Listagem (sessão B2B): GET /api/sucessao/eventos · GET /api/sucessao/:id. UI: dashboard → Sucessão.
Outras rotas de mobilidade (sessão B2B)
GET /api/colaboradores-internos— lista (?status=ativo&q=)POST /api/colaboradores-internos/import-csv— CSV via dashboard (csv_text/csv_base64,dry_run)GET /api/vagas/:id/mobilidade— sugestões de match internoPOST /api/vagas/:id/mobilidade/vincular— body{ colaborador_id }
Ingest de talentos (extensão)
Usado pela extensão Chrome. Body com curriculo (texto ≥ 50 chars);
opcional vaga_titulo / vaga_id para vincular candidatura + score.
Origem deve ser extension ou domínio permitido (CORS).
Cron interno
GET /api/cron/daily — agendado pela Vercel; protegido por secret de cron.
Reprocessa webhooks, lembretes de entrevista e rituais de experiência. Não use em integrações externas.
APIs B2B comuns (sessão)
Exigem cookie de sessão B2B. Úteis para scripts internos ou o próprio dashboard.
Vagas
GET /api/vagas— lista com contagem de candidaturasPOST /api/vagas— cria (tituloobrigatório)GET /api/vagas/:id·PATCH /api/vagas/:idGET /api/vagas/:id/link-publico— URL pública + cupom
Candidaturas
GET /api/candidaturas?vaga_id=— opcionalcensurar=1(LGPD)POST /api/candidaturas—{ vaga_id, talento_id }GET /api/candidaturas/:id·PATCH /api/candidaturas/:id(ex.:status_pipeline)
Config e automações
GET|PUT /api/config/organizacao— incluiwebhook_url/ secret (GET não devolve o secret em claro)GET|PUT /api/config/templatesPOST /api/automations/preview·POST /api/automations/executePOST /api/webhooks/test— disparawebhook.teste
APIs públicas / candidato
GET /api/vagas/public/:slug— dados da vaga com link público ativoPOST /api/vagas/:slug/candidatar— candidatura pela página pública (cupomopcional)GET /api/cupons/validar?codigo=@NOME— valida cupom de embaixador/B2BPOST /api/cupons/atribuir— atribui cupom a usuário/candidatura (extensão / CORS)POST /api/funil-b2b— lead RH de /saibamais (rate limit)POST /api/embaixador/candidatar— candidatura a embaixador (home / Parceria)GET /api/candidato/portal?t=TOKEN— portal do candidato (token 90 dias)- Pulse / avaliação 90 dias — tokens em links e-mail (
/api/pulse/responder,/api/avaliacao-90/responder)
Exemplos
curl — sync de colaboradores (Make/Zapier)
curl -X POST 'https://vagafit.net/api/v1/colaboradores/sync' \
-H 'Content-Type: application/json' \
-H 'X-VagaFit-Sync-Secret: SEU_WEBHOOK_SECRET' \
-d '{
"colaboradores": [
{ "nome": "Ana Silva", "email": "ana@empresa.com", "cargo_atual": "Analyst", "tags": "sql" }
],
"full_sync": false
}'
curl — sucessão / cargo crítico (9-Box)
curl -X POST 'https://vagafit.net/api/v1/sucessao/risco' \
-H 'Content-Type: application/json' \
-H 'X-VagaFit-Sync-Secret: SEU_WEBHOOK_SECRET' \
-d '{
"source": "mereo",
"external_id": "mereo-role-123",
"cargo": {
"titulo": "Head de Produto",
"area": "Produto",
"senioridade": "Sênior",
"skills": ["product strategy", "OKRs"]
},
"titular": { "risco": "saida_iminente" },
"min_score": 70
}'
fetch — listar vagas (sessão no browser)
const res = await fetch('https://vagafit.net/api/vagas', {
credentials: 'include'
});
const vagas = await res.json();
Make — módulo HTTP
- Módulo HTTP → Make a request
- URL:
https://vagafit.net/api/v1/colaboradores/sync - Method:
POST - Headers:
Content-Type: application/json,X-VagaFit-Sync-Secret: {{seu_secret}} - Body type: Raw / JSON com o array
colaboradores
Para receber eventos do ATS: use um Webhook Make (URL custom) e configure essa URL
em Comunicação → Webhooks. Valide X-VagaFit-Signature (HMAC). Ver
docs de webhooks.
Validar HMAC (Node)
const crypto = require('crypto');
function ok(secret, rawBody, signatureHeader) {
const expected = crypto.createHmac('sha256', secret).update(rawBody).digest('hex');
return expected === signatureHeader;
}
Erros
| Status | Quando |
|---|---|
400 |
Body inválido, campos obrigatórios ausentes |
401 |
Sem sessão / sync secret inválido / token expirado |
403 |
Origem CORS não autorizada |
404 |
Recurso não encontrado |
429 |
Rate limit (ex.: simulação de triagem) |
502 |
Falha em dependência (ex.: IA na simulação) |
Respostas de erro tipicamente: { "error": "mensagem" }.
Rate limits
Há rate limit em memória por IP em rotas sensíveis de simulação de triagem:
30 req / minuto em /api/triagem/sim/* → 429 se excedido.
Payload de contratação / PDI
Ative em Configurações → 5. Avançado. Ao mover para Contratado,
o VagaFit emite contratacao.payload_pdi (e inclui o bloco em
candidatura.contratada.data.payload_contratacao).
{
"evento": "contratacao.payload_pdi",
"ts": "2026-07-20T15:00:00.000Z",
"candidatura_id": "CD-12345678",
"data": {
"forcas": ["Comunicação", "Ownership"],
"gaps_identificados": ["Desenvolver skill: python"],
"sugestao_pdi_90_dias": [
{
"titulo": "Dominar o playbook do time em 30 dias",
"prazo_dias": 90,
"origem": "okr_rampa",
"prioridade": 1
}
],
"colaborador": { "nome": "...", "email": "..." },
"vaga_titulo": "Product Analyst",
"score_match": 82,
"atribuicao_canal": {
"origem": "extension",
"canal_label": "Extensão VagaFit",
"veio_da_extensao": true,
"chaves_cruzamento": { "email_colaborador": "ana@empresa.com" },
"performance_pos_contratacao": { "metas_batidas_pct": null, "faturamento_atribuido": null },
"custo_contratacao_eficiente": { "custo_por_contratacao": null }
}
}
}
No Make/n8n: filtre por evento === "contratacao.payload_pdi".
Use atribuicao_canal.origem + e-mail para cruzar performance Mereo (semente de
Custo por Contratação Eficiente). Detalhes em /docs/webhooks.