JazzHR¶
Observed on live postings, last on 2026-10-25. The fixture page is tests/pages/jazzhr/apply.html, served as a posting's page in tests/test_jazzhr.py.
Where the form is¶
- Postings:
<account>.applytojob.com/apply/<code>/<slug>, the code ten letters and digits. The posting's page holds the form,form#form_submit_new_resume, under the description. The double-send key ishttps://<account>.applytojob.com/apply/<code>. - A posting that is gone answers 410 with the career page and no form, read as
posting_gone. - A tracking banner (
#tracking-consent-banner) shows a moment after the page, over its foot; the blocker's lists hide it onapplytojob.com. - JazzHR's API takes the employer's key, so there is no request read.
Reading the form¶
The form is server-rendered HTML in a Bootstrap layout: each field a .form-group with a label.control-label, required ones marked <i class="asterisk">*</i>. A field's id is its element's id without resumator-, questionnaire- and -value (firstname, q2293318, eeo_gender). Each rendering and on how many of 15 postings (2026-10-20):
| Rendering | Field type | Postings |
|---|---|---|
input[type=text] with a label[for]: name, salary, LinkedIn, referral, college |
text |
15 |
input[type=email] |
text |
15 |
input[type=tel] |
phone |
15 |
| Address: one label over four inputs (address, city, state, postal), the last three named by their placeholder; its star stands for all four | text each |
13 |
Resume: input[type=file] behind "Attach resume", beside "Paste resume" (resumator-resumetext-value, a textarea) |
file (.pdf .doc .docx .odt .txt .rtf) and text alternatives, one_of resume, both under the resume's star |
15 |
textarea: cover letter, references, a questionnaire question |
text |
6 |
select with a placeholder option (resumator_no_selection or "No answer", left out): citizenship, over 18, education, questionnaire questions |
choice |
10 |
select with optgroups (citizenship by country) |
choice, the groups flattened |
4 |
input.resumator-datepicker: start date, a questionnaire date |
date; jQuery UI's datepicker, set up with yy-mm-dd, takes the ISO date typed |
4 |
Questionnaire checkboxes: a hidden .resumator-questionnaire-checkbox-answer and a box per option |
multi_choice |
3 |
EEO select inside its label, "Decline to answer" a real option (gender, race) |
choice |
3 |
Veteran status radios (resumator-eeoc_veteran-value) |
choice |
1 |
| Disability radios (form CC-305) and its name and date, labelled "Disability status" | choice, text, date |
1 |
| SMS consent, one checkbox | choice, Yes/No |
2 |
| reCAPTCHA v2 checkbox ("Human Check") | not a field; ticked on submit | 12 |
Every other control is hidden and not a field. The disability name and date are required by the page only when a disability is declared: their required_when is the status on its YES option.
Filling¶
- Plain inputs, selects (by the option's text), radios and boxes, set directly; nothing reaches JazzHR before submit.
- "Attach resume" is clicked to show the file input before the resume is attached; "Paste resume" (or the file side's own "Paste resume" link) to show the textarea before a pasted resume is typed.
- A questionnaire's boxes are joined into its hidden answer only on submit, so they read back by which are checked.
Read-back and submit¶
- The read-back is the inputs.
- Submit ticks the reCAPTCHA box and waits for its token; an image challenge in its place is
blocked. Clicking "Submit Application" runs the page's own check, joins the questionnaire boxes and posts the form to the posting's URL; the evidence is the page that post answers. Not observed on a send yet.