Emploi APIemploi.ma ↗
Access Moroccan job listings, company profiles, and job categories from Emploi.ma. Search jobs by keyword, category, or company with 6 endpoints.
What is the Emploi API?
The Emploi.ma API provides access to Morocco's job board through 6 endpoints covering job search, full job details, company profiles, and category listings. The search_jobs endpoint accepts keyword, category, and company filters and returns up to 25 paginated results per page, each with title, location, experience level, and employment type. get_job_detail delivers the complete posting including salary range, required qualifications, and posting date.
curl -X GET 'https://api.parse.bot/scraper/879833ad-4dce-4db8-9d64-d07b11b916ec/search_jobs?page=0&query=dev&metier_id=1127&company_nid=8979235' \ -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 emploi-ma-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: Emploi.ma Job Board SDK — browse categories, search jobs, drill into details."""
from parse_apis.emploi_ma_job_board_api import EmploiMa, CompanyNotFound
client = EmploiMa()
# List job categories to find one for filtering
categories = client.categories.list(limit=5)
for cat in categories:
print(cat.name, cat.id, cat.count)
# Search tech jobs using a keyword
job = client.jobsummaries.search(query="dev", limit=1).first()
if job:
print(job.title, job.company_name, job.location)
# Drill into the full detail
detail = job.details()
print(detail.description[:100], detail.employment_type, detail.experience_level)
# Browse featured jobs from the homepage
for featured in client.featuredjobs.list(limit=3):
print(featured.title, featured.company_name, featured.posted_date)
# List companies and get a profile
company_summary = client.companysummaries.list(limit=1).first()
if company_summary:
try:
profile = company_summary.details()
print(profile.name, profile.description[:80], profile.criteria)
except CompanyNotFound as exc:
print(f"Company not found: {exc}")
print("exercised: categories.list / jobsummaries.search / details / featuredjobs.list / companysummaries.list / companysummaries.details")
Search for job listings on Emploi.ma with optional filters. Returns paginated results with up to 25 jobs per page. Results include title, company, location, experience level, employment type, and a description snippet. Paginates via a 0-based page counter.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number (0-based) for pagination. |
| query | string | Search keyword to filter job listings (e.g. 'dev', 'comptable'). Omitting returns all jobs. |
| metier_id | string | Job category (métier) ID filter. Valid IDs can be obtained from list_job_categories endpoint. |
| company_nid | string | Company NID filter. Valid NIDs can be obtained from list_companies endpoint. |
{
"type": "object",
"fields": {
"jobs": "array of job listing objects with title, url, company_name, company_url, description_snippet, location, experience_level, education_level, employment_type, and posted_date",
"count": "integer total number of jobs returned on this page"
},
"sample": {
"data": {
"jobs": [
{
"url": "https://www.emploi.ma/offre-emploi-maroc/comptable-confirmee-casablanca-9313098",
"title": "Comptable Confirmé(e) - Casablanca",
"location": "Casablanca-Mohammedia",
"company_url": "https://www.emploi.ma/recruteur/9312183",
"company_name": "Jnanealfida",
"employment_type": "CDI & CDD",
"experience_level": "Expérience entre 2 ans et 5 ans et plus",
"description_snippet": "Nous recherchons des professionnels qualifiés..."
}
],
"count": 25
},
"status": "success"
}
}About the Emploi API
Job Search and Listings
The search_jobs endpoint accepts four optional parameters: query for keyword filtering (e.g. dev, comptable), metier_id for category filtering, company_nid for narrowing to a specific employer, and page for 0-based pagination. Each result in the jobs array includes title, company_name, company_url, location, experience_level, description_snippet, and a url you can pass directly to get_job_detail. The count field tells you how many results were returned on that page.
Full Job Details and Company Profiles
get_job_detail takes a full Emploi.ma posting URL and returns a structured object with salary (min, max, currency — or null when not disclosed), location (region, city, remote flag), languages, posted_date, job_category, requirements as an array of strings, and the full description text. For company research, get_company_profile accepts an NID and returns name, description, and a criteria object covering fields such as Ville, Pays, Secteur d'activité, and Site Internet.
Discovery Endpoints
Three supporting endpoints help you build filters and stay current. list_job_categories returns every available métier with its id, name, and live count of open positions — feed those IDs into search_jobs as metier_id. list_companies returns a directory of featured employers with name, nid, and url, providing the company_nid values for search filtering. get_featured_jobs pulls the current homepage snapshot of promoted listings with title, url, company_name, posted_date, and location — useful for surfacing high-visibility postings without a search query.
The Emploi API is a managed, monitored endpoint for emploi.ma — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when emploi.ma 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 emploi.ma 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?+
- Build a Morocco-focused job aggregator filtered by city or region using the
locationfields fromsearch_jobs. - Track salary ranges for specific roles in Morocco by collecting
salary.minandsalary.maxfromget_job_detailover time. - Monitor a target company's open positions by passing its
company_nidtosearch_jobson a schedule. - Classify job postings by sector using
list_job_categoriescounts to identify which métiers have the most active hiring. - Enrich a recruiter CRM with company sector, city, and website data from
get_company_profile. - Surface promoted listings for a job alert newsletter using
get_featured_jobsas a daily snapshot. - Analyze required qualifications across a job category by batching
get_job_detailcalls for all jobs matching ametier_id.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Emploi.ma have an official developer API?+
What does `get_job_detail` return that `search_jobs` does not?+
search_jobs returns a summary per listing: title, company, location, experience level, and a description snippet. get_job_detail adds the full description text, the requirements array, a structured salary object (min, max, currency), the remote flag inside location, required languages, posted_date, and job_category. If salary is not disclosed on the posting, the salary field is null.How does pagination work in `search_jobs`?+
page parameter is 0-based: passing page=0 (or omitting it) returns the first page, page=1 the second, and so on. Each page returns up to 25 results. The count field in the response reflects how many jobs are on the current page, not the total across all pages. There is no total-count field, so you must paginate until a page returns fewer than 25 results or an empty jobs array.Does the API return job application links or allow submitting applications?+
url on Emploi.ma and full job details, but does not expose application form data or support submitting applications. You can fork this API on Parse and revise it to add an endpoint that retrieves application-specific fields from individual posting pages.Does `list_companies` return all companies on Emploi.ma?+
list_companies returns a featured/directory page of companies — it is not a full index of every employer that has posted on the site. Some companies that appear in job listings may not be present in this list. You can fork this API on Parse and revise it to add paginated company listing endpoints to increase coverage.