Dayforce HCM APIjobs.dayforcehcm.com ↗
Search public Dayforce candidate portal job postings and retrieve full application form definitions including sections, fields, and questionnaires.
What is the Dayforce HCM API?
This API exposes 2 endpoints for Dayforce-hosted career portals: search_jobs returns paginated job postings with titles, descriptions, locations, and posting IDs, while get_application_form returns the complete application form structure for any posting — every section, field, questionnaire, and candidate acknowledgement text. It covers any client namespace hosted on jobs.dayforcehcm.com.
curl -X GET 'https://api.parse.bot/scraper/40460a30-fc98-4ceb-b63e-a049f154b412/get_application_form?job_posting_id=2243' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace jobs-dayforcehcm-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: Dayforce Candidate Portal — search jobs, inspect an application form."""
from parse_apis.jobs_dayforcehcm_com_api import Dayforce, JobNotFound
client = Dayforce()
# Browse all open postings (limit= caps total items fetched).
for job in client.jobs.search(limit=5):
loc = job.locations[0].formatted_address if job.locations else "Remote"
print(f"{job.title} — {loc} (posted {job.posted_at:%Y-%m-%d})")
# Drill into the first result's application form.
job = client.jobs.search(limit=1).first()
if job is not None:
form = job.application_form()
print(f"\nApplication form for '{job.title}' (template {form.template_id})")
print(f"Acknowledgement: {form.candidate_acknowledgement}")
for section in form.sections or []:
print(f" Section: {section.title} (required={section.is_required})")
for field in section.fields:
print(f" - {field.label} (required={field.is_required})")
if section.questionnaire:
for q in section.questionnaire.questions:
print(f" ? {q.label}")
# Point lookup by a known posting id; handle missing postings.
try:
detail = client.job(job_posting_id=job.job_posting_id)
print(f"\nLooked up: {detail.title}, can_apply={detail.can_apply}")
except JobNotFound:
print("Posting no longer available.")
print("\nexercised: jobs.search / job.application_form / job (point lookup)")
Returns the application form template a candidate sees when applying to one job posting on a Dayforce candidate portal: every section in display order (e.g. Personal Information, Resume Upload, References, questionnaire sections such as Additional Personal Information, Submit Application), each section's fields with label, wire field name, required and visible flags, and each questionnaire's questions with answer type and answer options. Fields backed by a site-wide pick list (Prefix, Suffix, CandidateSource) carry their option list in `options`; other fields have `options` null. Sections that are questionnaires have `fields` empty and `questionnaire` populated; sections with plain fields have `questionnaire` null. The form is returned even for expired postings. Four fixed upstream round trips per call. An unknown posting id yields a stale_input (input_not_found) result.
| Param | Type | Description |
|---|---|---|
| culture | string | Locale code used for labels, e.g. en-GB. Only the default was exercised. |
| career_site | string | Career site code, the path segment after client_namespace in the portal URL. Only the default was exercised. |
| job_posting_idrequired | string | Numeric job posting id as it appears in the portal job URL (…/jobs/<id>) and in search_jobs.jobs[*].job_posting_id. |
| client_namespace | string | Dayforce client namespace, the first path segment after the locale in the portal URL (…/en-GB/<client_namespace>/…). Only the default was exercised. |
{
"type": "object",
"fields": {
"sections": "array of form sections in display order; each has section_id, code (site xRefCode, null for questionnaire sections), title, description, is_required, sequence, fields[] (field_id, field_name, label, description, is_required, is_visible, sequence, options[] or null) and questionnaire (null or {questionnaire_id, title, description, questions[] with question_id, label, text, is_required, answer_type (integer site code), options[] of option_id/label/has_follow_up})",
"template_id": "integer id of the application template",
"job_posting_id": "the requested posting id, echoed as a string",
"client_namespace": "client namespace the form belongs to",
"footer_statement": "footer text of the form, null when none",
"candidate_acknowledgement": "declaration text the candidate must confirm on submit",
"candidate_source_statement": "prompt shown for the Candidate Source field"
},
"sample": {
"data": {
"sections": [
{
"code": "PERSONALINFORMATION",
"title": "Personal Information",
"fields": [
{
"label": "Prefix",
"options": [
{
"id": 1,
"label": "Mr"
},
{
"id": 2,
"label": "Mrs"
}
],
"field_id": 18,
"sequence": 1,
"field_name": "Prefix",
"is_visible": true,
"description": "Prefix",
"is_required": false
},
{
"label": "First Name",
"options": null,
"field_id": 19,
"sequence": 2,
"field_name": "FirstName",
"is_visible": true,
"description": "First Name",
"is_required": true
}
],
"sequence": 0,
"section_id": 1,
"description": "Personal Information",
"is_required": true,
"questionnaire": null
},
{
"code": null,
"title": "Additional Personal Information",
"fields": [],
"sequence": 2,
"section_id": 22,
"description": "Additional Personal Information",
"is_required": false,
"questionnaire": {
"title": "Additional Personal Information",
"questions": [
{
"text": "Do you have the right to work in the UK?",
"label": "Right to Work",
"options": [
{
"label": "Yes",
"option_id": 19,
"has_follow_up": false
},
{
"label": "No",
"option_id": 20,
"has_follow_up": false
}
],
"answer_type": 5,
"is_required": true,
"question_id": 28
}
],
"description": "Additional Personal Information",
"questionnaire_id": 10
}
}
],
"template_id": 13,
"job_posting_id": "2243",
"client_namespace": "edenprojecthr",
"footer_statement": null,
"candidate_acknowledgement": "I confirm that the information I have supplied is correct and true.",
"candidate_source_statement": "How did you hear about this job?"
},
"status": "success"
}
}About the Dayforce HCM API
Job Search
The search_jobs endpoint accepts a client_namespace (the path segment identifying the employer on the Dayforce portal), an optional keyword for free-text filtering across job titles and requisition IDs, and a 1-based page number. Each response page contains up to 10 postings and includes total and has_more fields for pagination. Each posting in the jobs array carries a job_posting_id, job_req_id, title, HTML-entity-encoded description, posting and expiry timestamps, and location data.
Application Form Structure
The get_application_form endpoint takes a job_posting_id (as returned by search_jobs) and a client_namespace. It returns the full form template a candidate would see when applying, structured as an ordered array of sections. Each section includes a section_id, a code (xRefCode for standard sections, null for questionnaire sections), a title, and a description. The response also surfaces a template_id, footer_statement, candidate_acknowledgement declaration text, and candidate_source_statement.
Locale and Multi-Site Support
Both endpoints accept a culture parameter (e.g. en-GB) for locale-specific labels and a career_site code to target a specific portal sub-site within a client's Dayforce setup. These parameters are optional and fall back to the client's defaults when omitted.
Coverage Scope
The API covers only data visible on a client's public Dayforce candidate portal — postings the employer has published, and the application form definition attached to each. Internally managed fields such as hiring manager notes, candidate records, or internal requisition workflow data are not part of the public portal surface and are not returned.
The Dayforce HCM API is a managed, monitored endpoint for jobs.dayforcehcm.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when jobs.dayforcehcm.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official jobs.dayforcehcm.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Aggregate open roles across multiple Dayforce-hosted employers into a unified job board using
search_jobswith differentclient_namespacevalues - Pre-fill or mirror application form fields in a custom UI by reading section and field definitions from
get_application_form - Monitor when new postings appear or existing ones expire using
postingandexpirytimestamps fromsearch_jobs - Extract questionnaire section structures from
get_application_formto analyze what screening questions employers ask - Build a job alert system by periodically paging through
search_jobsresults and comparingjob_posting_idsets - Validate that a job posting is still active before directing candidates by checking it appears in
search_jobsresults - Retrieve
candidate_acknowledgementandfooter_statementtext for compliance documentation of application terms
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Dayforce HCM have an official public developer API?+
What does `get_application_form` return for questionnaire sections?+
sections array in display order alongside standard sections. Their code field is null (standard sections carry a site xRefCode). Each questionnaire section has a section_id, title, and description. The section array ordering reflects the sequence a candidate would encounter when filling out the form.How does pagination work in `search_jobs`?+
page_size: 10. The page parameter is 1-based. The response includes total (total matching postings) and has_more (boolean) so you can determine whether additional pages exist without doing an extra request.Does the API return individual field definitions within each form section?+
sections array in get_application_form describes sections and their metadata, but granular field-level definitions (input types, validation rules, option lists per field) are noted in the endpoint description as partially covered. If you need deeper field-level schema extraction, you can fork the API on Parse and revise it to expose that additional structure.Can the API retrieve candidate application data or submission history?+
search_jobs and the form template structure from get_application_form. You can fork the API on Parse and revise it to add endpoints targeting other public-facing portal data if the candidate portal exposes it.