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.
termUnitvaleSEMESTERS,MONTHSouYEARS; quando vemnull, 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
}
]
}
| Campo | Como usar |
|---|---|
offers[].id | é o admissionOfferId do envio. A oferta já carrega curso e polo |
offers[].courseModality | quando 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[].chargesFee | se aquela forma paga a taxa. Mostre applicationFeeAmount só quando for true |
journeys[].examRequired | se aquela forma tem prova neste edital |
journeys[].examPeriodEnded | o 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 item | Valores | O que fazer |
|---|---|---|
requirement | REQUIRED · OPTIONAL · HIDDEN | não mostre o HIDDEN; marque o OPTIONAL como opcional |
requiredAt | APPLICATION · ENROLLMENT | mostre só o APPLICATION. O de ENROLLMENT é pedido na matrícula |
status | FIXED · REGULATORY · CONFIGURABLE | informativo: identidade e curso, exigência do Censo, escolha da instituição |
category | PERSONAL · ACADEMIC | para agrupar a tela, se quiser |
requiredWhenAnswered | a fieldKey de outro campo, ou null | este 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 tela | O que a pessoa preenche | A chamada |
|---|---|---|
| 1 · Curso | nome, celular, e-mail, curso e polo | POST /applications/draft sem CPF, com o captureLinkId se houver: guarde o draftToken |
| 2 · Forma de ingresso | a forma (journeys[].id); aqui aparece a taxa | POST /applications/draft com o draftToken e admissionNoticeEntryFormId |
| 3 · Dados complementares | CPF e data de nascimento no topo, depois os campos do edital | POST /applications/draft com o draftToken, CPF, nascimento e formAnswers; a resposta traz draftToken: null |
| 4 · Revisão | o aceite do uso dos dados | POST /applications com tudo e dataConsentAt (e o draftToken, se ainda houver) |
| 5 · Confirmação | nada | guarde 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:
| Forma | status na resposta |
|---|---|
| Vestibular | UNDER_REVIEW, ou FEE_PENDING quando a forma cobra taxa e o edital libera a prova só depois do pagamento |
| Nota do ENEM | APPROVED 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ção | UNDER_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 demais | SUBMITTED, 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ção | Resposta |
|---|---|
| primeiro envio | 200 |
| 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ído | 200, com o mesmo id |
| o passo 3 traz um CPF que já tem rascunho neste edital, com o mesmo nascimento | 200 com o rascunho que já existia; o do draftToken deixa de existir |
| o mesmo CPF com outra data de nascimento | 422 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ígitos | 400, no rascunho e no envio; nada é gravado. A regra de cada campo |
| a pessoa já concluiu e tenta de novo, mesmo por um rascunho novo | 409 CANDIDACY_NOT_EDITABLE. Mostre a situação da inscrição dela |
| o edital fechou, falta o aceite ou um campo obrigatório | 422 |
| o período da prova do vestibular terminou | 409 EXAM_PERIOD_ENDED |
Repassar a origem — Se o endereço do seu site trouxe
?origem=, resolva-o comGET /links/{slug}e mande ocaptureLinkIdque 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.