MarocAnnonces API

Search Morocco's classifieds board for jobs, cars and apartments, then read any ad in full

MarocAnnonces.com is one of Morocco's oldest classifieds sites and its biggest board for job offers and CVs, next to used cars, apartments, phones and services.

no credit card1,000 free credits · instant API key · pay by card or crypto
Missing a MarocAnnonces endpoint, or need a source we don't have yet?Contact us real people · same-day reply.
M
/marocannonces/v1

4 active endpoints, on 1 and 2 credit tiers.

  • POST/marocannonces/v1/search
  • POST/marocannonces/v1/listing
  • POST/marocannonces/v1/categories
  • POST/marocannonces/v1/cities

What MarocAnnonces endpoints does ReefAPI ship?

4 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.

4 endpoints

search

2 cr

Search MarocAnnonces.com, Morocco's general classifieds site.

required
—
optional
query, category, city, min_price, max_price, with_photos, make, year_min, year_max, mileage_min, mileage_max, fuel, bedrooms, bathrooms, surface_min, surface_max, page, include_pii

listing

2 cr

One MarocAnnonces ad in full.

required
—
optional
id, url, include_pii

categories

1 cr

MarocAnnonces' category tree.

required
—
optional
category

cities

1 cr

The 81 Moroccan cities MarocAnnonces filters on, with their ids.

required
—
optional
—

Every parameter, every allowed value →

MarocAnnonces API

6 of 4 endpoints, ready to run

View docs ↗

Used cars in Morocco by make, year and fuel

2 credits0 required · 4 optional
POST/marocannonces/v1/search
idle
// Press "Try it" and this pane shows exactly what the
// live site returned this second — including an empty
// result, if that is the truth. No key, no account.

How the MarocAnnonces API works

MarocAnnonces is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.

01
Authenticate
x-api-key header

No OAuth app, no request signing, no per-site account. One key covers all 438 engines.

02
Call
POST /marocannonces/v1/…

Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.

03
Pay
1 or 2 credits per call

Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.

04
Read
{ ok, data, meta, error }

One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.

From a job category to a dated feed of Moroccan offers with recruiters

Filter the job board to one city, read the offers that matter in full, and keep the recruiter behind each one.

01search?category=309&city=Casablanca
GET/marocannonces/v1/search?category=309&city=Casablanca

The newest job offers in Casablanca, 20 rows per page with title, city and publication time. On job searches 5 of the 20 are paid placements, flagged is_premium, and they repeat on every page. has_more tells you whether another page exists.

02listing?id=<id>
GET/marocannonces/v1/listing?id=<id>

The full offer: description, sector, function, contract type, education level, salary text, valid-through date, the recruiter's shop page when there is one, and the advertiser's phone when the ad shows it.

03search?category=309&city=Casablanca&page=2
GET/marocannonces/v1/search?category=309&city=Casablanca&page=2

Keep paging while has_more is true; paid placements repeat on every page, so skip rows with is_premium.

A dated feed of Moroccan job offers with sector, contract, education level and the recruiter behind each one, refreshed from the newest ads first.

request
curl -X POST https://api.reefapi.com/marocannonces/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"query":"dacia","category":"314"}'
response envelope
{
  "ok": true,
  "data": { … },
  "meta": {
    "api": "marocannonces",
    "endpoint": "search",
    "mode": "live",
    "latency_ms": …,
    "record_count": …
  },
  "error": null
}

What a MarocAnnonces field actually contains

Fields that read differently from how they look. Every row was measured against live MarocAnnonces pages on 2026-10-07.

FieldWhat it holds
price_mad vs price_textprice_text is the price exactly as the ad prints it ('98 000 DH'); price_mad is the same number as an integer. Job offers and CVs carry no price, so both are null there. On 13 search-to-listing pairs per run, over two runs, the search price and the ad page's price agreed 13/13 both times.
Seller-typed pricesMarocAnnonces does not check prices. We measured an apartment for sale in Rabat at 5,500 DH (a rent typed in the sale category) and a service ad at 1 DH. We publish what the advertiser typed and never rescale it.
seller.phoneThe number behind the ad's 'Afficher le numéro' button, in the site's own format (0XX-XXX-XXXX), with phone_masked as the page shows it before the click. Older ads that the site still keeps online often show no phone at all: then it is null.
seller.nameThe advertiser name as typed. Many private sellers type a placeholder such as 'xxxxx' and we return it unchanged. Recruiters and shops add seller.shop with the shop's name, page and logo.
published_atMoroccan local time. Search cards and ad pages print the day and month but often not the year ('7 Oct-10:03', '02 Sep 14:52'): the year is the current one unless that date would lie in the future. published_text keeps the original wording.
is_premiumPaid placements the site shows above the results. They carry no date and appear on every page of the same search, so drop or de-duplicate them if you page through. The jobs search for Casablanca opened with 4.
has_more (no total)MarocAnnonces prints no result count on search pages, so search returns no total. has_more follows the site's own 'next page' link. Past the real end the site returns an empty page; past page 100 it would repeat page 100, so page 101 and later are refused and page_ceiling_reached is set on page 100.
jobOnly on job offers: the posting's date, valid_through, contract type, sector, hiring organisation and salary text, read from the job-posting data the page publishes. Its salary and sector matched the ad's own attribute list on every sampled offer.

Search reaches the ads published in roughly the last five weeks: the used-car search ended at 365 ads with the oldest dated 2 September, while the category page counts 2,591 used cars including its older archive. Read an archive ad directly with listing if you have its number.

Morocco coverage, measured

Every number below was read from live MarocAnnonces pages on 2026-10-07, over two consecutive runs of 38 calls each and a separate filter run.

Market

Morocco only, 81 cities, prices in Moroccan dirhams as the advertiser typed them. 7 top-level categories and 53 subcategories: jobs and CVs, cars and motorbikes, property for sale and for rent, services, household goods and multimedia.

Volume

The category pages counted 38,710 ads in Emploi (10,406 job offers, 23,657 CVs) and 4,079 in Auto-Moto (2,591 used cars). Search reaches roughly the last five weeks of them: 365 used cars, 699 apartments for rent, 561 apartments for sale.

Filters that bite

Out of 365 used cars: Diesel 249, Essence 68, Dacia 33, 2018 or newer 139, at most 100,000 km 142, 100,000-200,000 DH 138, with photos 336. Out of 699 apartments for rent: 2 bedrooms 338, 100 m² or more 161, Casablanca 249. Out of 561 apartments for sale: 3 bedrooms 209. Job offers fill all 100 pages search serves (at least 1,500 offers without paid placements); Rabat 604, keyword comptable 411.

Field fill

Counted on one search page and 4 full ads in each of 6 categories. Title, city and category 120/120 search rows; price on 19/20 cars, 20/20 rentals, 18/20 sales, 19/20 phones (jobs and CVs carry none); district on 16/20 rentals and 14/20 sales. Full ads: description, views and attributes 24/24; advertiser phone 16/16 on cars, flats and phones, 0/8 on job offers and CVs, which use a reply button instead; the job block 4/4 on job offers.

Values

On 13 search-to-listing pairs per run across cars, job offers, CVs, apartments for sale and rent, phones and services: title, price, city and category agreed with the ad page 13/13 in both runs.

Identity

The id a search row returns is the ad number listing takes. 13 of 14 round-trips resolved to the same ad in each of two runs; the 14th was one ad the site still listed in search after its page was removed, answered as not found.

Limits

No result count on search pages, no sort order other than newest first, no map coordinates. Search covers about five weeks of ads and at most 100 pages (2,000 rows) per query. Older ads kept online often show no publication date and no phone.

What people build with MarocAnnonces

The jobs this data is most often used for.

4

endpoints

1/2

credits per call

01

Collect Moroccan job offers by city and sector with contract type, education level and the recruiter behind each offer.

02

Track used-car prices in Morocco by make, year, mileage and fuel, in dirhams, with the seller's phone for each ad.

03

Build a rent and sale price index for Casablanca, Rabat or Marrakech by bedrooms and surface, with the district of each apartment.

04

Watch resale prices of phones and laptops across Moroccan cities from the Multimédia categories.

What MarocAnnonces data costs

The cheapest call here is 1 credit, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.

Full pricing →
$0.67–$1.50 / 1,000 credits
  • 1,000 free credits on signup, no card
  • One key, all 438 APIs, one credit pool
  • Failed and blocked calls are never charged
  • Credits roll over and never expire

Call it in two lines

Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.

curl
curl -X POST https://api.reefapi.com/marocannonces/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"query":"dacia","category":"314"}'
python
import requests

r = requests.post(
    "https://api.reefapi.com/marocannonces/v1/search",
    headers={"x-api-key": REEF_KEY},
    json={
  "query": "dacia",
  "category": "314"
},
)
print(r.json()["data"])
FAQ

Have a question? We got answers.

The questions people actually ask before wiring up MarocAnnonces.

Get a free key →
Do I need a MarocAnnonces account or a Moroccan IP?▾

No. Every endpoint is read without an account or a login, and you call reefapi.com from anywhere.

Which categories can I search?▾

All of them: Emploi (job offers, CVs, internships, freelance, training), Auto-Moto (used cars, 4x4, motorbikes, trucks, boats, parts, car-sharing), property for sale and for rent (apartments, villas and riads, studios, shops, offices, land, farms), Multi Services, Ventes diverses (furniture, appliances, animals, clothing and more) and Multimédia (phones, computers, consoles, cameras). The categories endpoint lists the 60 ids.

How do I find used cars of one make, year and mileage?▾

Use category=314 with make, year_min/year_max, mileage_min/mileage_max and fuel. Measured on 2026-10-07 against 365 used cars in search: Diesel 249, Essence 68, Dacia 33, 2018 or newer 139, at most 100,000 km 142, 100,000-200,000 DH 138, with photos 336.

Can I separate apartments for rent from apartments for sale?▾

Yes, they are separate categories: 315 is apartments for sale and 321 apartments for rent. Both take bedrooms, bathrooms, surface_min and surface_max. Out of 699 apartments for rent, 2 bedrooms left 338, at least 100 m² 161, and Casablanca 249.

Do you return the advertiser's phone number and name?▾

Yes, exactly as the ad publishes them: the advertiser name, the phone number behind the ad's 'show number' button, and for recruiters and shops their shop page. Nothing is masked.

Why is there no total count in search results?▾

Because MarocAnnonces does not print one on its search pages. We return has_more instead, which follows the site's own next-page link, and an empty page once you go past the last one.

How far back does search go?▾

About five weeks of ads, and at most 100 pages of 20 rows per query: MarocAnnonces serves page 100 again for any later page, so we stop there and say so in page_ceiling_reached. The used-car search ended at 365 ads over 19 pages, the oldest dated 2 September 2026; job offers fill all 100 pages, so narrow them by city or keyword. Older ads the site still keeps online can be read one by one with listing.

Is the description the full ad text?▾

Yes. listing returns the whole description with its line breaks, every photo in full size, and every attribute the ad page lists, not the shortened search card.

What is the MarocAnnonces API?▾

MarocAnnonces API is a ReefAPI endpoint group for morocco's classifieds as json: job offers and cvs, used cars, flats for sale and rent, phones and services, with the advertiser's phone. It returns live JSON through POST requests under /marocannonces/v1.

Is the MarocAnnonces API free to try?▾

Yes. ReefAPI starts with 1,000 free credits, no card required. MarocAnnonces calls use the same shared credit balance as every other ReefAPI engine.

Do I need a MarocAnnonces login or account?▾

No login to MarocAnnonces is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.

How fresh is the MarocAnnonces data?▾

The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.

How many credits does the MarocAnnonces API use?▾

MarocAnnonces actions currently cost 1-2 credits per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.

Can I call MarocAnnonces from an AI assistant or MCP client?▾

Yes. Connect ReefAPI once through MCP and your assistant can call marocannonces actions with the same key, credit pool and JSON envelope used by normal REST requests.

99 Classifieds & Second-hand APIs on the same key

One key, one credit pool, one response envelope. If you are pulling MarocAnnonces, you are one call away from the rest of the category — no second contract, no second integration.

Need something this API does not do?

Name the endpoint, the field, or a source we do not carry yet. We ship new APIs every week and you would be first to get the key. Real people read every message and reply the same day.

0/4000

No account needed · we reply from [email protected]

Try it on your own data before you pay anything

The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 437 APIs, and the same envelope everywhere.

Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-10-07.