Updated April 22, 2026
/api/v1/vacancies
curl -X GET \
"https://app.recruitsome.com/api/v1/vacancies" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept: application/json"
const response = await fetch('https://app.recruitsome.com/api/v1/vacancies', {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Accept': 'application/json',
},
});
const data = await response.json();
console.log(data);
use Illuminate\Support\Facades\Http;
$response = Http::withToken('YOUR_API_KEY')
->acceptJson()
->get('https://app.recruitsome.com/api/v1/vacancies');
$data = $response->json();
List Vacancies
Retrieve a paginated list of active vacancy publications with filtering and sorting options.
Endpoint
GET /api/v1/vacancies
Query Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
page | integer | 1 | Page number for pagination |
per_page | integer | 20 | Items per page (max: 100) |
search | string | - | Search in title and summary |
language | string | - | Filter by language code (2 characters) |
location_id | integer/array | - | Filter by location ID(s) |
department_id | integer/array | - | Filter by department ID(s) |
job_types[] | array | - | Filter by job type IDs |
education_levels[] | array | - | Filter by education level IDs |
tags[] | array | - | Filter by tag IDs (main tags cascade to include sub-tags) |
sort | string | published_at | Sort field: published_at, title, created_at |
sort_direction | string | desc | Sort direction: asc or desc |
include | string | - | Include additional data: facets |
include_media | boolean | false | Include header image URLs |
include_compensation | boolean | false | Include basic compensation data |
include_company_name | boolean | false | Include company name in the company_location object (opt-in for privacy) |
company_location_id | integer/array | - | Filter by company location ID(s) (work site, for agency tenants). Supports array notation: company_location_id[]=1&company_location_id[]=2 |
Response Fields
| Field | Type | Description | |
|---|---|---|---|
id | integer | Unique vacancy publication ID | |
slug | string | URL-friendly identifier | |
title | string | Vacancy title | |
summary | string | Brief description (HTML) | |
language | string | Language code (ISO 639-1) | |
published_at | string | ISO 8601 publication date | |
ends_at | string\ | null | ISO 8601 expiration date |
views_count | integer | Number of times viewed | |
location | object\ | null | Location details (office/branch location) |
company_location | object\ | null | Company location details (actual work site, for agency tenants) |
department | object\ | null | Department details |
hiring_manager | object\ | null | Hiring manager details |
education_levels | array | Required education levels | |
job_types | array | Employment types | |
experience_levels | array | Experience/seniority levels (e.g., Junior, Medior, Senior, Lead) | |
work_arrangement | object\ | null | Work model: on-site, hybrid, or remote |
tags | array | Job category tags (main and sub-categories) | |
application_url | string | URL to apply for this position | |
metadata | object | Additional vacancy metadata | |
header_image | object\ | null | Header image URLs (only when include_media=true) |
images | object\ | null | Map of all configured image crops (only when include_media=true) |
compensation | object | Basic compensation data (only when include_compensation=true) |
Null Field Handling
The API consistently includes core relationship fields (location, company_location, department, hiring_manager) in all responses, even when they have no value:
nullvalue: The field exists but has no data (e.g., vacancy has no location assigned)- Field always present: These fields are guaranteed to be in the response structure
This predictable structure allows you to safely access these fields without existence checks.
Object Structures
Location Object
{
"id": 123,
"name": "Amsterdam Office",
"city": "Amsterdam",
"country_code": "NL",
"country_name": "Netherlands"
}
Company Location Object
The work site location for agency vacancies. Returns null for non-agency tenants or when no company location is assigned.
{
"id": 789,
"name": "Shell Pernis Refinery",
"city": "Rotterdam",
"country_code": "NL",
"country_name": "Netherlands",
"company_name": "Shell Nederland B.V."
}
The company_name field is only included when include_company_name=true is passed. This is opt-in to prevent accidentally exposing which client company an agency is recruiting for.
Department Object
{
"id": 456,
"name": "Engineering Department"
}
Hiring Manager Object
{
"given_name": "John",
"family_name": "Doe",
"full_name": "John Doe",
"job_title": "Engineering Manager",
"email": "[email protected]",
"avatar": {
"small": "https://...",
"medium": "https://...",
"large": "https://...",
"xlarge": "https://...",
"original": "https://..."
}
}
Education Level Object
{
"id": 1,
"name": "Bachelor"
}
Job Type Object
{
"id": 1,
"name": "Full-time"
}
Experience Level Object
{
"id": 3,
"name": "Senior"
}
Possible values: Junior, Medior, Senior, Lead. Returns an empty array when no experience level is assigned.
Work Arrangement Object
{
"value": "Hybrid remote",
"label": "Hybride"
}
The value field contains the canonical identifier (on-site, Fully remote, Hybrid remote). The label is the localized display name.
Tag Object
{
"id": 5,
"name": "Software Engineer",
"type": "sub",
"parent_id": 1
}
The type field indicates whether the tag is a main category or a sub category. Main tags have parent_id: null.
Metadata Object
{
"status": "active"
}
Compensation Object (when include_compensation=true)
Basic compensation summary for list view:
{
"salary_range": {
"min": 3500,
"max": 5000,
"currency": "EUR",
"period": "monthly"
},
"contract_hours": 40
}
Note: For full compensation details (including holidays breakdown), use the detail endpoint with include_compensation=true.
Header Image Object (Legacy, when include_media=true)
{
"small": "https://...",
"medium": "https://...",
"large": "https://...",
"xlarge": "https://...",
"original": "https://..."
}
Images Object (when include_media=true)
Map of all configured image crops. The 'default' key corresponds to the legacy header_image.
{
"default": {
"url": "https://...",
"width": 1200,
"height": 675,
"mime_type": "image/jpeg"
},
"narrow_casting": {
"url": "https://...",
"width": 1080,
"height": 1920,
"mime_type": "image/jpeg"
}
}
Pagination
The response includes pagination metadata:
{
"data": [...],
"links": {
"first": "https://api.example.com/api/v1/vacancies?page=1",
"last": "https://api.example.com/api/v1/vacancies?page=5",
"prev": null,
"next": "https://api.example.com/api/v1/vacancies?page=2"
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 5,
"links": [...],
"path": "https://api.example.com/api/v1/vacancies",
"per_page": 20,
"to": 20,
"total": 94,
"facets": {...} // Only when include=facets
}
}
Facets
When include=facets is specified, the response includes aggregated counts for filtering:
{
"meta": {
"facets": {
"locations": [
{
"id": 1,
"name": "Amsterdam",
"count": 15,
"selected": false
}
],
"company_locations": [
{
"id": 10,
"name": "Shell Pernis",
"city": "Rotterdam",
"country_code": "NL",
"country_name": "Netherlands",
"count": 5,
"selected": false
}
],
"departments": [
{
"id": 5,
"name": "Engineering",
"count": 23,
"selected": false
}
],
"experience_levels": [
{
"id": 3,
"name": "Senior",
"count": 12,
"selected": false
}
],
"education_levels": [
{
"id": 8,
"name": "Bachelor",
"count": 28,
"selected": false
}
],
"job_types": [
{
"id": 1,
"name": "Full-time",
"count": 45,
"selected": false
}
],
"tags": [
{
"id": 1,
"name": "Engineering",
"count": 32,
"selected": false,
"sub_tags": [
{
"id": 5,
"name": "Software Engineer",
"count": 18,
"selected": false
},
{
"id": 6,
"name": "DevOps Engineer",
"count": 8,
"selected": false
}
]
}
],
"languages": [
{
"code": "en",
"name": "English",
"count": 38,
"selected": false
}
]
}
}
}
Note: The tags facet uses a hierarchical structure where main categories contain nested sub_tags. When filtering by a main tag, all its sub-tags are automatically included.
Example Request
Basic Request
curl -X GET https://api.example.com/api/v1/vacancies \
-H "Authorization: Bearer YOUR_API_TOKEN"
With Filters and Options
curl -X GET "https://api.example.com/api/v1/vacancies?search=developer&location_id=1&include_compensation=true&include=facets" \
-H "Authorization: Bearer YOUR_API_TOKEN"
Example Response
{
"data": [
{
"id": 123,
"slug": "senior-developer-position",
"title": "Senior Software Developer",
"summary": "Join our team to build innovative solutions...",
"language": "en",
"published_at": "2024-01-15T09:00:00+00:00",
"ends_at": "2024-02-15T23:59:59+00:00",
"views_count": 42,
"location": {
"id": 1,
"name": "Amsterdam Office",
"city": "Amsterdam",
"country_code": "NL",
"country_name": "Netherlands"
},
"company_location": null,
"department": {
"id": 5,
"name": "Engineering"
},
"hiring_manager": {
"given_name": "John",
"family_name": "Doe",
"full_name": "John Doe",
"job_title": "Engineering Manager",
"email": "[email protected]",
"avatar": null
},
"education_levels": [
{
"id": 1,
"name": "Bachelor"
}
],
"job_types": [
{
"id": 1,
"name": "Full-time"
}
],
"tags": [
{
"id": 1,
"name": "Engineering",
"type": "main",
"parent_id": null
},
{
"id": 5,
"name": "Software Engineer",
"type": "sub",
"parent_id": 1
}
],
"application_url": "https://careers.example.com/senior-developer-position",
"metadata": {
"status": "active"
}
}
],
"links": {
"first": "https://api.example.com/api/v1/vacancies?page=1",
"last": "https://api.example.com/api/v1/vacancies?page=5",
"prev": null,
"next": "https://api.example.com/api/v1/vacancies?page=2"
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 5,
"path": "https://api.example.com/api/v1/vacancies",
"per_page": 20,
"to": 20,
"total": 94
}
}
Notes
- Only active publications from the internal channel are returned
- Results are sorted by
published_atdescending by default - The list view does not include full job descriptions, requirements, or offers
- Use the detail endpoint to get complete vacancy information
- Education levels, job types, and tags arrays may be empty if none are specified
- When filtering by a main tag, all its sub-tags are automatically included (cascade filtering)
- Salary amounts are in the base currency unit (e.g., 3500 = €3,500)
- Compensation salary uses the vacancy's own fields as primary source; hours fall back to employment conditions (CompanyRemuneration) if the vacancy has no hours set