Lever APIjobs.eu.lever.co ↗
Retrieve full application form structure from EU Lever job postings — sections, field types, required status, and dropdown options via one API endpoint.
What is the Lever API?
The EU Lever Application Form API exposes the complete structure of job application forms hosted on jobs.eu.lever.co through a single get_application_form endpoint. A single call returns 9 top-level fields including all form sections, field labels, input types, required flags, and dropdown options for a given company and job posting UUID — giving you everything needed to inspect or integrate an employer's application requirements programmatically.
curl -X GET 'https://api.parse.bot/scraper/ee1530ca-f911-4061-8427-40d24ae2c28f/get_application_form?company=xtb&posting_id=6fb09849-90f8-42d2-afb5-6a05acf2da9c' \ -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-eu-lever-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: Lever EU Job Application Form API — fetch and inspect a posting's form."""
from parse_apis.jobs_eu_lever_co_api import LeverEU, InputFormatInvalid
client = LeverEU()
# Fetch the application form for a known job posting.
try:
form = client.application_forms.get(company="xtb", posting_id="6fb09849-90f8-42d2-afb5-6a05acf2da9c")
except InputFormatInvalid as e:
print("Invalid input:", e.message)
raise
print(f"{form.job_title} — {form.location} ({form.commitment}, {form.workplace_type})")
print(f"Team: {form.team}")
print(f"Apply at: {form.application_url}")
# Walk each form section and its fields.
for section in form.sections:
print(f"\n[{section.section}]")
for field in section.fields:
req = "required" if field.required else "optional"
print(f" {field.label} ({field.type}, {req})")
print("\nexercised: application_forms.get")
Retrieves the complete application form for a specific job posting on EU Lever. Returns the form structure organized by sections (e.g. personal information, links, custom questions, consent) with each field's label, input type, required status, and dropdown options where applicable. Also includes the job posting's title, location, team, commitment type, and workplace type. Makes one HTTP request to fetch the apply page and parses the HTML form.
| Param | Type | Description |
|---|---|---|
| companyrequired | string | Company slug as it appears in the Lever job posting URL (e.g. 'xtb' from jobs.eu.lever.co/xtb/...). |
| posting_idrequired | string | UUID of the job posting as it appears in the Lever URL (e.g. '6fb09849-90f8-42d2-afb5-6a05acf2da9c'). |
{
"type": "object",
"fields": {
"team": "Team or department",
"company": "The company slug",
"location": "Job location",
"sections": "Array of form sections, each with a section name and array of fields",
"job_title": "Job title from the posting header",
"commitment": "Employment type (e.g. Full-time)",
"posting_id": "The posting UUID",
"workplace_type": "Workplace model (e.g. Hybrid, Remote)",
"application_url": "Full URL of the application form page"
},
"sample": {
"data": {
"team": "Research – Research",
"company": "xtb",
"location": "Lisboa",
"sections": [
{
"fields": [
{
"type": "file",
"label": "Resume/CV",
"required": true
},
{
"type": "text",
"label": "Full name",
"required": true
},
{
"type": "email",
"label": "Email",
"required": true
},
{
"type": "text",
"label": "Phone",
"required": true
},
{
"type": "text",
"label": "Current location",
"required": true
},
{
"type": "text",
"label": "Current company",
"required": false
}
],
"section": "Submit your application"
},
{
"fields": [
{
"type": "text",
"label": "LinkedIn URL",
"required": false
},
{
"type": "text",
"label": "GitHub URL",
"required": false
},
{
"type": "text",
"label": "Portfolio URL",
"required": false
},
{
"type": "text",
"label": "Other website",
"required": false
}
],
"section": "Links"
},
{
"fields": [
{
"type": "dropdown",
"label": "Have you previously been employed by XTB?",
"options": [
"Yes",
"No"
],
"required": true
},
{
"type": "text",
"label": "What is your expected monthly base salary (no bonus included)? Please enter numbers only, including gross amount and currency",
"required": true
},
{
"type": "dropdown",
"label": "What is your notice period?",
"options": [
"Immediate",
"2 weeks",
"1 month",
"2 months",
"3 months"
],
"required": true
},
{
"type": "dropdown",
"label": "Visa permission",
"options": [
"No, I don't need a visa nor work permit in the location that I am applying for",
"I don't need a visa, but I will need a work permit if I am going to change Employer/work for XTB in location that I am applying for",
"Yes, I need visa and work permit to work in location that I am applying for"
],
"required": true
}
],
"section": "More details"
},
{
"fields": [
{
"type": "checkbox",
"label": "Yes, XTB can contact me about future job opportunities for up to 1 year",
"required": false
}
],
"section": "Consent"
}
],
"job_title": "Financial Research Analyst",
"commitment": "Full-time",
"posting_id": "6fb09849-90f8-42d2-afb5-6a05acf2da9c",
"workplace_type": "Hybrid",
"application_url": "https://jobs.eu.lever.co/xtb/6fb09849-90f8-42d2-afb5-6a05acf2da9c/apply"
},
"status": "success"
}
}About the Lever API
What the API returns
The get_application_form endpoint accepts two required parameters: company (the slug as it appears in the Lever URL, e.g. xtb) and posting_id (the UUID identifying the specific job posting, e.g. 6fb09849-90f8-42d2-afb5-6a05acf2da9c). The response includes job metadata — job_title, team, location, commitment, and workplace_type — alongside the full sections array that describes the application form itself.
Form structure in detail
The sections array is the core of the response. Each entry contains a section name (such as personal information, links, custom questions, or consent) and an array of fields. For each field you get its label, input type (e.g. text, dropdown, checkbox, textarea), whether it is required, and any dropdown options where applicable. This makes it straightforward to map out exactly what an applicant must supply before submitting to a given role.
Additional metadata
Beyond form structure, the response includes application_url (the full URL of the form page), posting_id, and company — useful for bookkeeping when processing multiple postings. Fields like commitment (e.g. Full-time) and workplace_type (e.g. Hybrid, Remote) let you filter or display role context without a separate lookup.
The Lever API is a managed, monitored endpoint for jobs.eu.lever.co — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when jobs.eu.lever.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 jobs.eu.lever.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 EU Lever job postings to compare required field counts by role or team
- Pre-populate or validate candidate data against specific field types and required flags before submission
- Build a job board that surfaces workplace_type and commitment data alongside standard listing details
- Detect custom consent fields across employer postings to flag GDPR-related form requirements
- Sync Lever application form structures into an internal ATS or HR tooling database using posting_id as a stable key
- Generate candidate-facing guides that enumerate every required field for a specific job posting
- Monitor changes to a job posting's application form over time by diffing the sections response
| 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 Lever have an official developer API?+
What does the sections field actually contain?+
sections array contains one entry per logical grouping in the application form — for example, personal information, links, custom questions, and consent. Each section holds an array of fields with a label, input type, required boolean, and (where relevant) an array of dropdown options. The structure mirrors what a candidate would see when filling out the form.Does the API return the job description or posting body text?+
Can I retrieve all job postings for a company rather than one at a time?+
posting_id UUID for each call — it does not enumerate all open postings for a given company slug. You can fork this API on Parse and revise it to add a listing endpoint that returns all active posting IDs for a company.Is the form data specific to the EU Lever platform, or does it also cover jobs.lever.co?+
company and posting_id parameters must correspond to postings on the EU domain for results to be returned correctly.