FirstStage APIintersect-mbo.firststage.co ↗
Retrieve full application form definitions from Intersect MBO's FirstStage careers site: steps, questions, hints, validation rules, and section groupings per job listing.
What is the FirstStage API?
The Intersect MBO FirstStage API exposes one endpoint — get_application_form — that returns the complete application form for any job listing on intersect-mbo.firststage.co. A single call yields over a dozen structured response fields including ordered question objects with types, hints, validation rules, and section groupings, plus metadata like job_title, organisation, location, and total_questions. It is designed for teams that need to inspect or mirror job application requirements programmatically.
curl -X POST 'https://api.parse.bot/scraper/38f43042-731e-4135-9239-035f56b2cbc6/get_application_form' \
-H 'X-API-Key: $PARSE_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"job_id": "bNOFKiAOnk"
}'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 intersect-mbo-firststage-co-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: fetch a FirstStage job application form and inspect its structure."""
from parse_apis.intersect_mbo_firststage_co_api import FirstStage, InputNotFound
client = FirstStage()
# Fetch the full application form for a known job listing.
try:
form = client.application_forms.get(job_id="bNOFKiAOnk")
except InputNotFound:
print("Job listing not found or closed.")
raise
print(f"{form.job_title} at {form.organisation} — {form.location}")
print(f"Total questions: {form.total_questions}")
# Walk the application steps (upload CV, enter details, etc.).
for step in form.steps:
suffix = f" (accepts {', '.join(step.accepted_file_types)})" if step.accepted_file_types else ""
print(f" Step: {step.label}{suffix}")
# Inspect each question with its type and whether it is required.
for q in form.questions:
req = "required" if q.required else "optional"
print(f" [{q.position}] {q.title} ({q.control_type}/{q.control_subtype}, {req})")
if q.hint:
print(f" Hint: {q.hint[:80]}")
for opt in q.options:
print(f" - {opt.label}: {opt.value}")
# Show how questions are grouped into sections.
for section in form.sections:
print(f" Section '{section.name}': {', '.join(section.question_slugs)}")
print("exercised: application_forms.get")
Returns the complete application form for one job listing, identified by the job_id from its /jobs/<job_id>/view URL. The site only reveals the form after an application has been started, so each call starts a new unsubmitted draft application on the site with a one-line placeholder CV attached, waits for the site to process it, and then reads every question page; nothing is ever submitted and no personal data is entered. One call costs roughly 3 + (number of questions) page requests and typically takes 15-30 seconds. The payload contains the three high-level steps (CV upload, details, review), `fields` as an ordered array of one object per question (site id, URL slug, title, question wording, markdown hint, control type/subtype such as text/single-line, single-choice/radio-compact, hardcoded/verified-email or assisted/interview, the answer options where the control has a fixed choice list, validation rules and a derived `required` flag, and for AI-assisted interview questions the interviewer guidance and completion criteria), plus `sections` grouping question slugs by the category label the site assigns (e.g. `common/UK Contact Details`, `Requirements / Location`; assisted interview questions have no site category and are grouped as `Assisted interview`). `total_questions` is checked against the step count the site reports. An unknown or closed job_id returns a stale_input error.
| Param | Type | Description |
|---|---|---|
| job_idrequired | string | Job listing identifier taken from the listing URL /jobs/<job_id>/view (alphanumeric, e.g. one shape is a 10-character id). |
{
"type": "object",
"fields": {
"steps": "array of the three application steps (name, label; the upload step also lists accepted CV file extensions)",
"fields": "ordered array of question objects: id, slug, title, question, hint (markdown or null), category (null for assisted questions), control_type, control_subtype, options (array of {value,label}, empty when free text), validations (site rule names), required (boolean), common, sensitive, guidance and criteria (assisted interview questions only, else null), position (1-based)",
"job_id": "the requested job identifier, echoed",
"location": "job location text from the listing",
"sections": "array of {name, fields}: site category label and the ordered question slugs it contains",
"job_title": "job title from the listing",
"organisation": "hiring organisation name",
"total_questions": "integer count of question pages, equal to fields length"
},
"sample": {
"data": {
"steps": [
{
"name": "upload",
"label": "Upload CV",
"accepted_file_types": [
".docx",
".pdf",
".rtf",
".txt",
".md",
".html"
]
},
{
"name": "details",
"label": "Enter details"
},
{
"name": "submit",
"label": "Review and submit"
}
],
"fields": [
{
"id": "6ba52b06ac",
"hint": null,
"slug": "full-name",
"title": "Full Name",
"common": true,
"options": [],
"category": "common/UK Contact Details",
"criteria": null,
"guidance": null,
"position": 1,
"question": "What is your full name?",
"required": true,
"sensitive": false,
"validations": [
"not-empty"
],
"control_type": "text",
"control_subtype": "single-line"
},
{
"id": "OZBQDtnb6Y",
"hint": null,
"slug": "right-to-work",
"title": "Right to work",
"common": false,
"options": [
{
"label": "Yes",
"value": "yes"
},
{
"label": "No",
"value": "no"
}
],
"category": "Requirements / Right to work",
"criteria": null,
"guidance": null,
"position": 7,
"question": "Do you have the right to work?",
"required": true,
"sensitive": false,
"validations": [
"not-empty"
],
"control_type": "single-choice",
"control_subtype": "radio-compact"
},
{
"id": "ZurmQOIawu",
"hint": null,
"slug": "start-up-exposure",
"title": "Start-up Exposure",
"common": false,
"options": [],
"category": null,
"criteria": "To move on, the candidate must cover:\n• Their exposure to start-up or early-stage environments\n• What the operating environment was like",
"guidance": "Encourage the candidate to describe whether they have worked in a technology start-up or early-stage organisation and what the day-to-day environment felt like.",
"position": 14,
"question": "Tell me about any experience you’ve had working in a technology start-up or early-stage organisation, and what the operating environment was like.",
"required": true,
"sensitive": false,
"validations": [],
"control_type": "assisted",
"control_subtype": "interview"
}
],
"job_id": "bNOFKiAOnk",
"location": "UK, or working closely within UK time-zone",
"sections": [
{
"name": "common/UK Contact Details",
"fields": [
"full-name",
"preferred-name",
"email-address",
"mobile-number"
]
},
{
"name": "Requirements / Right to work",
"fields": [
"right-to-work"
]
},
{
"name": "Assisted interview",
"fields": [
"scale-and-structure",
"values-in-distributed-teams",
"start-up-exposure"
]
}
],
"job_title": "Head of Operations (FTC)",
"organisation": "Intersect MBO",
"total_questions": 14
},
"status": "success"
}
}About the FirstStage API
What the API Returns
The get_application_form endpoint accepts a job_id string — the alphanumeric identifier found in any /jobs/<job_id>/view URL on the site — and returns the full application form definition for that listing. The response includes a steps array describing the three stages of the application (each step carries a name and label; the CV upload step also lists accepted file extensions), and a fields array containing every question in display order.
Question Objects and Sections
Each entry in fields includes an id, slug, title, question text, hint (markdown string or null), category (null for assisted questions), and full validation rules and answer options where applicable. The sections array maps site category labels to the ordered slug list of questions they contain, letting you reconstruct the form's visual grouping without doing that mapping yourself.
Job Metadata
Alongside the form definition, the response echoes the job_id you submitted and surfaces listing-level metadata: job_title, organisation (the hiring organisation's name), and location (free-text location from the listing). The integer total_questions field equals the length of the fields array and gives you a quick count without iterating.
Scope and Limitations
The API covers the application form definition only — it does not return candidate submissions, employer-side data, or a list of currently open roles. Each call is scoped to a single job_id; there is no batch or search parameter in the current endpoint. Form content reflects the state of the listing at the time of the request.
The FirstStage API is a managed, monitored endpoint for intersect-mbo.firststage.co — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when intersect-mbo.firststage.co 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 intersect-mbo.firststage.co 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 application form complexity across multiple Intersect MBO job listings by comparing
total_questionsandfieldsarrays - Extract question
hintand validation rule data to pre-populate or validate candidate answers in an external tool - Map
sectionstofieldsslugs to reconstruct the visual form layout for an accessibility review - Pull
job_title,organisation, andlocationto enrich a job-tracking spreadsheet with listing metadata - Detect when required question types (e.g. file upload with specific extensions from the
stepsarray) change between application cycles - Compare question ordering across different job listings to identify standardised versus role-specific form sections
| 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 Intersect MBO FirstStage have an official developer API?+
What does `get_application_form` return beyond the question list?+
fields array, the endpoint returns steps (the three application stages with labels and, for the upload step, accepted CV file extensions), sections (category labels mapped to ordered question slugs), and listing metadata: job_title, organisation, location, job_id, and total_questions.Does the API return a list of open job listings on the site?+
job_id. It does not expose a search or browse endpoint for discovering available roles. You can fork this API on Parse and revise it to add a job-listing discovery endpoint.Can I retrieve submitted application data or employer-side responses?+
Does the API support batch lookups for multiple job IDs in one call?+
get_application_form endpoint accepts one job_id per request. There is no batch parameter. You can fork the API on Parse and revise it to accept an array of IDs and iterate over them server-side.