Alion vacancies as JSON
1. Get a key
Create it in Settings → Security → API keys. For a higher limit, write to [email protected].
2. Request vacancies
curl -H "Authorization: Bearer alion_YOUR_KEY" \ "https://alion.io/api/job.getList"
{
"success": true,
"response": {
"items": [
{
"id": 1048040,
"url": "https://alion.io/job/openai-senior-backend-engineer-go",
"title": "Senior Backend Engineer (Go)",
"description": "We are looking for a backend engineer to build ...",
"company": {"id": 2, "name": "OpenAI", "domain": "openai.com", "logo": "https://alion.io/storage/...webp",
"description": "OpenAI is an AI research and deployment company ..."},
"seniority": "senior",
"work_mode": "hybrid",
"countries": ["US"],
"salary": {"min": 250000, "max": 380000, "currency": "USD", "period": "year"},
"technologies": ["Go", "Kubernetes", "PostgreSQL"],
"first_seen_at": "2026-09-13T20:12:28Z"
}
],
"has_more": true,
"next_cursor": "MTc4OTMzMDM0ODoxMDQ4MDQw"
}
}
100 vacancies per request. Each item is one vacancy with its description and its company (shortened here). Link candidates to its url.
3. Next page
Repeat the request with cursor= set to next_cursor. Stop when has_more is false. One query goes up to 20 pages (2,000 vacancies); for more, narrow it, for example with posted_since.
Filters
Add them to the URL as plain names. Case does not matter; separate several values with commas.
| Filter | Example |
|---|---|
| Country or city | locations=germany,poland · locations=berlin · locations=de |
| Role | roles=backend,frontend |
| Technology | technologies=python,react |
| Seniority | seniority=senior,lead |
| Work mode | work_mode=remote (or office) |
| Employment | employment=full-time |
| Industry | industries=fintech,ai |
| Company | company=stripe.com |
| Salary from, USD a year | salary_min=80000 |
| Keyword | search=kubernetes |
| New since | posted_since=24h |
| Page size | limit=50 (default and max 100) |
| Description as HTML, or none | description_format=html · description_format=none |
curl -H "Authorization: Bearer alion_YOUR_KEY" \ "https://alion.io/api/job.getList?locations=germany,poland&technologies=python&work_mode=remote"
Also: languages, english_level, education, benefits, remote_locations. A name we do not know returns 422 saying which one.
Accepted names
curl -H "Authorization: Bearer alion_YOUR_KEY" \ "https://alion.io/api/dict.getList?name=roles"
Other lists: countries, technologies&q=py, seniority, markets.
One vacancy with description
curl -H "Authorization: Bearer alion_YOUR_KEY" \ "https://alion.io/api/job.get?id=1048040"
Response fields
A field is null when the value is not known. Times are UTC (ISO 8601), money is in the posted currency plus USD.
| Vacancy field | Type | Values |
|---|---|---|
| id | integer | Alion vacancy id |
| url | string | Vacancy page on Alion (send candidates here) |
| title | string | Job title |
| description | string | Full text of the vacancy (plain text; HTML with description_format=html) |
| company | object | See the company table below |
| role | string | Role, e.g. Backend, Data Engineering |
| role_family | string | Role area, e.g. Backend, Data Science (dict.getList?name=roles) |
| seniority | string | intern, junior, middle, senior, staff, lead, head |
| employment_type | string | full_time, part_time, contractor, cofounder, freelance, internship |
| work_mode | string | on_site, hybrid, remote |
| remote_scope | string | For remote jobs: stated_countries, stated_regions, worldwide |
| hiring_geo_confidence | string | How the hiring geography is known: explicit, structured, inferred |
| locations | list of strings | Offices, e.g. "Berlin, Germany" |
| countries | list of strings | ISO codes of the offices, e.g. "DE" |
| hiring_countries | list of strings | For remote jobs: ISO codes of countries the company can hire in |
| salary | object | min, max, currency (USD, EUR…), period (year, month, week, day, hour), gross (true / false / null), usd_annual; null when not posted |
| salary_estimate | object | When no salary is posted: min_usd, max_usd, period (year), method, sample_n (vacancies the estimate is based on) |
| experience_years_min | integer | Years of experience required |
| visa_sponsorship, relocation_package, has_equity | boolean | true when the vacancy offers it |
| technologies | list of strings | Required technologies, e.g. "Python", "PostgreSQL" |
| status | string | live, closed |
| first_seen_at | datetime | When Alion found the vacancy; the feed is sorted by it |
| employer_posted_date | date | Posting date on the employer's job board |
| last_verified_at | datetime | When the vacancy was last confirmed |
| board_verified | boolean | true when the employer's job board confirmed it in the last two days |
| closed_at | datetime | When it closed (for closed ones) |
| days_open | integer | Days it has been open (until closing, for closed ones) |
| trust.level | string | ok, stale (open unusually long), ghost (reposted many times without hiring) |
| trust.repost_count | integer | How many times it was reposted |
| ids | object | role_id, seniority_id, employment_id, remote_id: the same values as ids, for the *_ids filters |
| Company field | Type | Values |
|---|---|---|
| id | integer | Alion company id (the company_id filter) |
| name, domain | string | Company name and website domain |
| url | string | Company page on Alion |
| logo | string | Logo image URL |
| description | string | About the company, plain text |
| industry, industry_segment | string | e.g. Financial Services / FinTech (dict.getList?name=markets) |
| size_band | string | 1-10, 11-50, 51-200, 201-500, 501-1000, 1001-5000, 5000+ |
| headquarters | object | city, country (name, iso) |
| is_staffing_agency | boolean | true for recruitment agencies |
| ats_vendor | string | The employer's hiring system, e.g. Greenhouse, Lever, Workday |
| open_jobs | integer | Open vacancies at the company on Alion |
Limits and errors
1,000 requests a day per key, unless we agreed a higher limit. 401 means a wrong key. 429 means the limit is reached: wait for the seconds in Retry-After.
