Pular para o conteúdo principal

Montar a sua página de inscrição

O candidato preenche no site da instituição e a inscrição chega à secretaria como qualquer outra. Toda chamada sai do seu servidor, com a chave; a página fala com o seu back-end (Como chamar).

O caminho​

Os passos 1 a 5 leem o que a sua página mostra; o 6 grava a inscrição. Na ordem abaixo, o seu site se comporta como a página da Workfuse: a inscrição existe como rascunho desde o primeiro passo, e o CPF só é pedido nos dados complementares. Na Transferência Externa e na 2ª Graduação, o documento avaliativo é anexado pelo candidato na área dele, na Workfuse: a porta não tem esse envio.

Nos exemplos, API_BASE/public/v1/admissions está abreviado e o header da chave vai em toda chamada.


1 · Vista a página com a marca da instituição​

curl "API_BASE/public/v1/admissions/institution" \
-H "Authorization: Bearer wf_sua_chave_aqui"
{
"name": "Faculdade Horizonte",
"slug": "faculdade-horizonte",
"website": "https://faculdade-horizonte.example",
"logoUrl": null,
"primaryColor": null
}

logoUrl e primaryColor saem do cadastro da instituição. Quando vêm nulos, use o nome em texto e a sua cor padrão.

2 · Liste os cursos​

curl "API_BASE/public/v1/admissions/courses" \
-H "Authorization: Bearer wf_sua_chave_aqui"
[
{
"id": "cmu4sh90n002fp0mbwer751xc",
"name": "Administração",
"area": "GESTÃO E NEGÓCIOS",
"description": "Formação em gestão com trilhas em finanças, marketing e operações…",
"degree": "BACHELOR",
"modalities": ["IN_PERSON", "ONLINE"],
"curriculums": [
{
"id": "cmu4sh97i00bzp0mbrozc896w",
"modality": "IN_PERSON",
"workloadHours": null,
"durationTerms": 8,
"termUnit": "SEMESTERS"
},
{
"id": "cmu4sh94k0063p0mb4bajrbyn",
"modality": "ONLINE",
"workloadHours": 2380,
"durationTerms": 8,
"termUnit": "SEMESTERS"
}
],
"hasOpenNotice": true
}
]

Três coisas para acertar de primeira:

  • hasOpenNotice: false é o curso que aparece sem botão, como "inscrições em breve".
  • Um curso só entra no catálogo se estiver ativo e tiver matriz vigente. Curso que você espera e não vem quase sempre é matriz vigente faltando.
  • Carga e duração são da matriz, não do curso. Um curso pode ter uma matriz presencial e outra a distância, cada uma com a própria carga e o próprio prazo. termUnit vale SEMESTERS, MONTHS ou YEARS; quando vem null, escreva "períodos".

A grade completa, período a período, está em GET /curriculums/{curriculumId}, que responde mesmo sem edital aberto.

3 · Descubra o edital do curso​

curl "API_BASE/public/v1/admissions/courses/cmu4sh90n002fp0mbwer751xc" \
-H "Authorization: Bearer wf_sua_chave_aqui"
{
"id": "cmu4sh90n002fp0mbwer751xc",
"name": "Administração",
"area": "GESTÃO E NEGÓCIOS",
"description": "Formação em gestão com trilhas em finanças, marketing e operações…",
"degree": "BACHELOR",
"blocks": [
{
"curriculumId": "cmu4sh97i00bzp0mbrozc896w",
"modality": "IN_PERSON",
"workloadHours": null,
"durationTerms": 8,
"termUnit": "SEMESTERS",
"admissionNoticeId": "cmu4sh97w00chp0mb551lq2jq"
},
{
"curriculumId": "cmu4sh94k0063p0mb4bajrbyn",
"modality": "ONLINE",
"workloadHours": 2380,
"durationTerms": 8,
"termUnit": "SEMESTERS",
"admissionNoticeId": "cmu4sh97y00ckp0mb1qhaytmo"
}
]
}

Um bloco por matriz vigente (em geral, uma por modalidade), e cada bloco traz o admissionNoticeId do edital que recebe a inscrição daquela matriz, ou null quando nenhum edital aberto a oferta.

Já tem o link do edital? — Quando a campanha manda o candidato para um endereço com ?processo=<noticeId>, pule os passos 2 e 3. Se o endereço traz ?origem=, resolva-o no passo 6.

4 · Leia o que o edital oferece​

curl "API_BASE/public/v1/admissions/notices/cmu4sh97w00chp0mb551lq2jq/showcase" \
-H "Authorization: Bearer wf_sua_chave_aqui"
{
"applicationFeeAmount": 60,
"offers": [
{
"id": "cmu4sh98800cup0mbmwo0fkkl",
"courseId": "cmu4sh90n002fp0mbwer751xc",
"campusId": "cmu4sh8zz001wp0mbs5h5j2ib",
"courseName": "Administração",
"courseDegree": "BACHELOR",
"courseModality": "IN_PERSON",
"campusName": "Polo Campinas SP",
"campusCity": "Campinas",
"campusState": "SP"
}
],
"journeys": [
{
"id": "cmu4sh98200cmp0mb0li3bfwo",
"entryFormName": "Vestibular",
"evaluationType": "EXAM_SCORE",
"examRequired": true,
"chargesFee": true,
"examPeriodEnded": false
},
{
"id": "cmu4sh98300cnp0mb2msxqpzv",
"entryFormName": "Nota do ENEM",
"evaluationType": "ENEM_SCORE",
"examRequired": false,
"chargesFee": false,
"examPeriodEnded": false
}
]
}
CampoComo usar
offers[].idé o admissionOfferId do envio. A oferta já carrega curso e polo
offers[].courseModalityquando vem ONLINE, não pergunte o polo: a oferta já o define
journeys[]as formas de ingresso abertas neste edital. journeys[].id é o admissionNoticeEntryFormId do envio e o ?journey= do passo 5
journeys[].chargesFeese aquela forma paga a taxa. Mostre applicationFeeAmount só quando for true
journeys[].examRequiredse aquela forma tem prova neste edital
journeys[].examPeriodEndedo período da prova já terminou: mostre a forma como encerrada. O envio nela responde 409

A taxa é do edital. A inscrição nasce cobrada quando o edital tem valor e a forma passa pela etapa de pagamento; senão, nasce isenta. Por isso o valor aparece junto da escolha da forma, não na primeira tela.

5 · Monte o formulário​

curl "API_BASE/public/v1/admissions/notices/cmu4sh97w00chp0mb551lq2jq/application-fields?journey=cmu4sh98200cmp0mb0li3bfwo" \
-H "Authorization: Bearer wf_sua_chave_aqui"
{
"fields": [
{
"fieldKey": "FULL_NAME",
"requirement": "REQUIRED",
"status": "FIXED",
"category": "PERSONAL",
"requiredAt": "APPLICATION",
"requiredWhenAnswered": null
}
],
"enrollmentDocuments": [
{
"kind": "HIGH_SCHOOL_CERTIFICATE",
"label": "Certificado de conclusão do ensino médio",
"timing": "AT_ENROLLMENT"
}
]
}

Os campos são um catálogo fixo; o edital decide a exigência de cada um, e a sua página lê essa decisão em vez de fixá-la:

Campo do itemValoresO que fazer
requirementREQUIRED · OPTIONAL · HIDDENnão mostre o HIDDEN; marque o OPTIONAL como opcional
requiredAtAPPLICATION · ENROLLMENTmostre só o APPLICATION. O de ENROLLMENT é pedido na matrícula
statusFIXED · REGULATORY · CONFIGURABLEinformativo: identidade e curso, exigência do Censo, escolha da instituição
categoryPERSONAL · ACADEMICpara agrupar a tela, se quiser
requiredWhenAnswereda fieldKey de outro campo, ou nulleste campo só é obrigatório quando aquele for respondido com "sim"

O que cada fieldKey é e para onde vai no corpo está em Os campos do formulário. enrollmentDocuments é a lista que a matrícula vai pedir (AT_ENROLLMENT ou AFTER_ENROLLMENT): mostre para a pessoa ir juntando, porque o envio de arquivo ainda não está aberto.

CEP — GET /postal-codes/{cep} devolve { street, district, city, state }, para o seu servidor não precisar de outro serviço.

6 · Grave a inscrição​

A página da Workfuse tem cinco passos, e cada um termina numa chamada:

Passo da telaO que a pessoa preencheA chamada
1 · Cursonome, celular, e-mail, curso e poloPOST /applications/draft sem CPF, com o captureLinkId se houver: guarde o draftToken
2 · Forma de ingressoa forma (journeys[].id); aqui aparece a taxaPOST /applications/draft com o draftToken e admissionNoticeEntryFormId
3 · Dados complementaresCPF e data de nascimento no topo, depois os campos do editalPOST /applications/draft com o draftToken, CPF, nascimento e formAnswers; a resposta traz draftToken: null
4 · Revisãoo aceite do uso dos dadosPOST /applications com tudo e dataConsentAt (e o draftToken, se ainda houver)
5 · Confirmaçãonadaguarde o id da inscrição
# Passo 1: o rascunho, sem CPF e sem forma de ingresso.
curl -X POST "API_BASE/public/v1/admissions/applications/draft" \
-H "Authorization: Bearer wf_sua_chave_aqui" \
-H "Content-Type: application/json" \
-d '{
"admissionNoticeId": "cmu4sh97w00chp0mb551lq2jq",
"admissionOfferId": "cmu4sh98800cup0mbmwo0fkkl",
"admissionNoticeEntryFormId": null,
"candidateName": "Bianca Teixeira",
"candidateEmail": "bianca.teixeira@exemplo.test",
"candidatePhone": "11992220077",
"formAnswers": {}
}'
{
"id": "cmu4ucd25000akgmbcxc4gg1d",
"status": "DRAFT",
"admissionNoticeId": "cmu4sh97w00chp0mb551lq2jq",
"admissionOfferId": "cmu4sh98800cup0mbmwo0fkkl",
"admissionNoticeEntryFormId": null,
"feePolicy": null,
"feeAmount": null,
"createdAt": "2026-09-17T01:18:30.173Z",
"updatedAt": "2026-09-17T01:18:30.173Z",
"rejoined": false,
"draftToken": "3f9c…64 hex"
}

Guarde o draftToken na sessão do seu site e mande-o em toda chamada seguinte, envio incluído. Enquanto não há CPF, ele é a única forma de voltar ao mesmo rascunho: sem ele, cada chamada abre um rascunho novo. Quando a resposta trouxer draftToken: null, descarte o token: reenviado numa chamada sem CPF, ele também abre um rascunho novo. As regras estão em O rascunho sem CPF.

Prefere pedir o CPF no primeiro passo? — Também funciona: mande CPF e nascimento já no primeiro rascunho, e não há token. Você só perde o rascunho de quem desiste antes de informar o CPF.

Rascunho sem forma de ingresso é um lead. A secretaria o vê na lista de Leads e pode falar com quem desistiu no meio. Ele vira inscrição quando o POST /applications informa a forma, e é a mesma inscrição, com o mesmo id.

O envio​

curl -X POST "API_BASE/public/v1/admissions/applications" \
-H "Authorization: Bearer wf_sua_chave_aqui" \
-H "Content-Type: application/json" \
-d '{
"admissionNoticeId": "cmu4sh97w00chp0mb551lq2jq",
"admissionOfferId": "cmu4sh98800cup0mbmwo0fkkl",
"admissionNoticeEntryFormId": "cmu4sh98200cmp0mb0li3bfwo",
"candidateName": "Bianca Teixeira",
"candidateCpf": "39053344705",
"candidateEmail": "bianca.teixeira@exemplo.test",
"candidatePhone": "11992220077",
"candidateBirthDate": "2006-02-09",
"dataConsentAt": "2026-09-17T01:18:38.000Z",
"draftToken": null,
"formAnswers": { "RG": "40.221.905-1", "GENDER": "female", "MARITAL_STATUS": "SINGLE" }
}'
{
"id": "cmu4ucd25000akgmbcxc4gg1d",
"status": "UNDER_REVIEW",
"admissionNoticeId": "cmu4sh97w00chp0mb551lq2jq",
"admissionOfferId": "cmu4sh98800cup0mbmwo0fkkl",
"admissionNoticeEntryFormId": "cmu4sh98200cmp0mb0li3bfwo",
"feePolicy": "CHARGED",
"feeAmount": 60,
"createdAt": "2026-09-17T01:18:30.173Z",
"updatedAt": "2026-09-17T01:18:40.609Z"
}

Guarde o id. É por ele que você consulta a situação depois. Não há sessão a abrir: a chave identifica o seu sistema, e quem é a pessoa o seu site já sabe.

O corpo do rascunho e o do envio são o mesmo (Corpo do envio), com três campos que só o envio exige: admissionNoticeEntryFormId, dataConsentAt e o par candidateCpf + candidateBirthDate. Sem o aceite, o envio responde 422 CANDIDACY_CONSENT_REQUIRED: o consentimento é colhido por você, e você declara quando.

A situação logo depois do envio depende da forma de ingresso:

Formastatus na resposta
VestibularUNDER_REVIEW, ou FEE_PENDING quando a forma cobra taxa e o edital libera a prova só depois do pagamento
Nota do ENEMAPPROVED ou REJECTED na hora, pela nota informada em formAnswers.ENEM_SCORE, ou FEE_PENDING na mesma condição do vestibular
Transferência externa e 2ª graduaçãoUNDER_REVIEW, à espera do documento avaliativo que o candidato anexa na área dele, ou FEE_PENDING quando a forma cobra taxa e o edital libera a avaliação só depois do pagamento
as demaisSUBMITTED, até a secretaria agir

Uma inscrição por pessoa em cada edital​

A chave da inscrição é edital + CPF, e você não a informa: ela é derivada. O que acontece em cada caso:

SituaçãoResposta
primeiro envio200
o mesmo envio chegou duas vezes ao mesmo tempo (duplo clique)200 nos dois, com a mesma inscrição
o rascunho existia e agora foi concluído200, com o mesmo id
o passo 3 traz um CPF que já tem rascunho neste edital, com o mesmo nascimento200 com o rascunho que já existia; o do draftToken deixa de existir
o mesmo CPF com outra data de nascimento422 CANDIDACY_IDENTITY_MISMATCH; o rascunho do token continua. Não diga qual dos dois não conferiu
a data de nascimento é de quem tem menos de 14 anos, ou o RG não tem de 5 a 13 dígitos400, no rascunho e no envio; nada é gravado. A regra de cada campo
a pessoa já concluiu e tenta de novo, mesmo por um rascunho novo409 CANDIDACY_NOT_EDITABLE. Mostre a situação da inscrição dela
o edital fechou, falta o aceite ou um campo obrigatório422
o período da prova do vestibular terminou409 EXAM_PERIOD_ENDED

Repassar a origem — Se o endereço do seu site trouxe ?origem=, resolva-o com GET /links/{slug} e mande o captureLinkId que ele devolve na primeira chamada (o rascunho do passo 1). A origem é gravada quando a inscrição nasce, e é assim que a secretaria vê de onde ela veio. Origem e links.

Depois do envio​

Para mostrar ao candidato em que pé está a inscrição, no seu site, siga Consultar a situação.