Gem APIjobs.gem.com ↗
Retrieve job application forms from jobs.gem.com — standard fields, custom screening questions, answer options, and EEOC survey config in one API call.
What is the Gem API?
The jobs.gem.com API exposes 1 endpoint — get_application_form — that returns the complete application form for any jobs.gem.com job posting across up to 13 structured response fields. Given a board_slug and job_post_id from a listing URL, the endpoint returns every section of the form: standard applicant fields, employer-defined screening questions with their answer options, location data, department, and EEOC demographic survey configuration.
curl -X GET 'https://api.parse.bot/scraper/efb4aac5-67a6-4f13-a9f5-04f292acf83a/get_application_form?board_slug=senndertechnologies-gmbh&job_post_id=am9icG9zdDow-hl-MZiIibYQLtscNrmG' \ -H 'X-API-Key: $PARSE_API_KEY'
Returns the application form for one jobs.gem.com job posting in a single round trip, identified by the two path segments of its listing URL (https://jobs.gem.com/<board_slug>/<job_post_id>). The payload carries posting context (title, requisition id, company, department, employment and location type, locations) and a `sections` object with four groups: `personal_information` (the standard identity/contact fields: first name, last name, email, phone, location), `profile` (career-profile fields such as LinkedIn URL and resume upload), `details` (the employer's custom screening questions, each with its answer type, display type, required flag and answer options with stable option ids), and `demographic_survey` (null when the posting has no voluntary demographic survey; otherwise the survey id, type and questions in the same question shape). Every standard field carries `field_type` (the site's field code, e.g. FIRST_NAME), a display `label` and `is_required`. `total_fields` counts all fields and questions across sections. Postings with no custom questions return an empty `details` array. An unknown board or posting id yields a not-found input error. Uploading a resume or submitting the form is not supported.
| Param | Type | Description |
|---|---|---|
| board_slugrequired | string | The employer's job board path segment, i.e. the first path segment of a jobs.gem.com listing URL (letters, digits, '-' or '_'). |
| job_post_idrequired | string | The job posting identifier, i.e. the second path segment of a jobs.gem.com listing URL (letters, digits, '-' or '_'). Echoed back unchanged as `job_post_id` in the payload. |
{
"type": "object",
"fields": {
"title": "job posting title",
"company": "employer display name",
"sections": "object with personal_information (array of standard fields), profile (array of standard fields), details (array of custom questions), demographic_survey (object or null)",
"locations": "array of posting locations with name, city, ISO-3 country and is_remote",
"board_slug": "job board path segment the form belongs to",
"department": "department name, null when absent",
"eeoc_config": "object of booleans race_and_gender, veteran_status, disability_status describing which EEOC parts the template enables",
"job_post_id": "posting identifier as used in the listing URL",
"total_fields": "integer count of all fields and questions across sections",
"includes_eeoc": "true when the posting includes an EEOC self-identification form",
"location_type": "site work-location code such as IN_OFFICE",
"requisition_id": "employer requisition reference shown under the form, null when absent",
"employment_type": "site employment type code such as FULL_TIME",
"is_application_form_hidden": "true when the employer hides the form on the posting page"
},
"sample": {
"data": {
"title": "Head of Product Operations (Maternity cover, 1 year contract)",
"company": "sennder Technologies GmbH",
"sections": {
"details": [
{
"text": "Are you currently based in Berlin, Barcelona or Amsterdam?",
"options": [
{
"value": "Yes",
"option_id": "cXVlc29wdDoYn1kst792uiea0nUnGeKn"
},
{
"value": "No",
"option_id": "cXVlc29wdDqT-882Gpvg2na7veKgHw1G"
}
],
"file_type": null,
"answer_type": "SINGLE_SELECT",
"description": null,
"is_required": true,
"question_id": "cXVlczqSixGvsy7fja1xV6NLqbP1",
"display_type": "RADIO_BUTTON",
"numeric_rating_range": null
}
],
"profile": [
{
"label": "LinkedIn URL",
"field_type": "LINKEDIN_URL",
"is_required": false
},
{
"label": "Resume",
"field_type": "RESUME",
"is_required": true
}
],
"demographic_survey": null,
"personal_information": [
{
"label": "First name",
"field_type": "FIRST_NAME",
"is_required": true
},
{
"label": "Last name",
"field_type": "LAST_NAME",
"is_required": true
},
{
"label": "Email",
"field_type": "EMAIL",
"is_required": true
},
{
"label": "Phone number",
"field_type": "PHONE",
"is_required": false
},
{
"label": "Location",
"field_type": "LOCATION",
"is_required": false
}
]
},
"locations": [
{
"city": "Barcelona",
"name": "Barcelona, Spain",
"country": "ESP",
"is_remote": false
}
],
"board_slug": "senndertechnologies-gmbh",
"department": "Technology ",
"eeoc_config": {
"veteran_status": false,
"race_and_gender": true,
"disability_status": false
},
"job_post_id": "am9icG9zdDow-hl-MZiIibYQLtscNrmG",
"total_fields": 8,
"includes_eeoc": false,
"location_type": "IN_OFFICE",
"requisition_id": "R7458",
"employment_type": "FULL_TIME",
"is_application_form_hidden": false
},
"status": "success"
}
}About the Gem API
What the API Returns
The get_application_form endpoint accepts two required path parameters — board_slug (the employer's job board segment, e.g. senndertechnologies-gmbh) and job_post_id (the posting identifier, e.g. am9icG9zdDow-hl-MZiIibYQLtscNrmG) — both taken directly from a jobs.gem.com listing URL. The response identifies the posting with title, company, department (null if absent), and job_post_id, plus a locations array that includes each location's name, city, ISO-3 country code, and is_remote flag.
Sections and Fields
The core of the response is the sections object, which groups all form inputs into three buckets: personal_information (standard contact and identity fields), profile (resume, portfolio, and similar profile fields), and details (custom screening questions defined by the employer, with their configured answer options). A total_fields integer gives the aggregate count of inputs across all sections without requiring manual enumeration.
EEOC and Demographic Survey
When a posting includes an EEOC self-identification form, includes_eeoc is set to true and the eeoc_config object details which components are active via three boolean flags: race_and_gender, veteran_status, and disability_status. This lets you determine exactly which demographic categories an employer's template has enabled without parsing freeform text.
The Gem API is a managed, monitored endpoint for jobs.gem.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when jobs.gem.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.gem.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?+
- Audit employer screening questions across multiple job postings to compare how companies filter candidates
- Aggregate EEOC survey coverage data using
eeoc_configflags to analyze which employers collect demographic information - Pre-fill or validate candidate application data by mapping
personal_informationandprofilefields before submission - Index custom
detailsquestions and their answer options to identify industry-specific screening patterns - Track remote-work availability by reading the
is_remoteflag in thelocationsarray across postings - Build job application assistants that surface exactly what a specific posting requires before a candidate starts filling it out
- Compare department-level application requirements using
departmentandsections.detailsacross an employer's board
| 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 jobs.gem.com have an official developer API?+
What does `get_application_form` return for the screening questions in a posting?+
sections.details array. Each entry includes the question text and its configured answer options. Standard candidate fields (name, email, etc.) are in sections.personal_information, and profile-related inputs such as resume upload are in sections.profile. The total_fields integer counts all inputs across all three arrays.Does the API return the full job description or salary information?+
Can I retrieve multiple job postings in one call, or search across an employer's entire board?+
board_slug and job_post_id. Bulk retrieval or board-level listing is not included. You can fork the API on Parse and revise it to add an endpoint that lists all active postings for a given board_slug.How do I find the correct `board_slug` and `job_post_id` values?+
https://jobs.gem.com/<board_slug>/<job_post_id>. For example, the URL https://jobs.gem.com/senndertechnologies-gmbh/am9icG9zdDow-hl-MZiIibYQLtscNrmG yields board_slug=senndertechnologies-gmbh and job_post_id=am9icG9zdDow-hl-MZiIibYQLtscNrmG.