Telecontact APItelecontact.ma ↗
Search and retrieve Moroccan business listings from telecontact.ma. Look up by keyword, city, phone, brand, or ICE number. Access contacts, reviews, and geolocation.
What is the Telecontact API?
The Telecontact.ma API covers 10 endpoints for querying Morocco's largest business directory, returning structured data on company names, addresses, phone numbers, ICE tax identifiers, and geolocation. Use search_national to run a keyword search across all cities and get paginated results, or drill into a specific listing with get_listing_detail to retrieve fields like director name, latitude/longitude, email, RC registration number, and business website.
curl -X GET 'https://api.parse.bot/scraper/eb802322-1c0c-436a-9168-97eba09d3517/search_national?page=1&query=restaurant' \ -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 telecontact-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.
from parse_apis.telecontact_ma_business_directory_api import Telecontact, BusinessSummary, Business, Activity, Brand
tc = Telecontact()
# Search for restaurants nationwide
for listing in tc.businesssummaries.search(query="restaurant", limit=5):
print(listing.name, listing.city, listing.url)
# Get full details for a specific business
biz = tc.businesses.get(url="https://www.telecontact.ma/annonceur/ink-services/2228915/casablanca.php")
print(biz.name, biz.telephone, biz.address)
# Get reviews for that business
review_result = biz.reviews()
print(review_result.total_reviews, review_result.average_rating)
for review in review_result.reviews:
print(review.author, review.rating, review.content)
# Browse a category
for listing in tc.businesssummaries.browse_category(category_slug="cliniques", limit=3):
detail = listing.details()
print(detail.name, detail.telephone, detail.activities)
# List all activities
for activity in tc.activities.list(limit=10):
print(activity.name, activity.url)
# List brands
for brand in tc.brands.list(limit=5):
print(brand.name, brand.url)
Full-text search across all Moroccan businesses. Matches query against business names and activities nationwide. Returns 20 results per page; paginate via the page parameter.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number for pagination. |
| queryrequired | string | Search keyword (activity, business name, etc.) |
{
"type": "object",
"fields": {
"total": "integer total number of results",
"results": "array of business summary objects with name, url, city, and summary"
},
"sample": {
"data": {
"total": 20,
"results": [
{
"url": "https://www.telecontact.ma/annonceur/12-cool/3293441/casablanca.php",
"city": "Casablanca",
"name": "12 Cool",
"summary": "12 Cool (0 avis) 35 bd Rachidi Lusitania Casablanca Maroc Restaurants"
}
]
},
"status": "success"
}
}About the Telecontact API
Search Methods
Five search endpoints let you find businesses using different identifiers. search_national and search_by_city both accept a query string (business name, activity type, etc.) and return up to 20 results per page with name, url, city, and summary fields. search_by_city narrows results to a single city such as casablanca or marrakech. search_by_phone performs reverse lookup against a phone or fax number. search_by_brand finds businesses that carry a given brand (e.g., samsung, bosch). search_by_ice looks up a business by its 15-digit ICE (Identifiant Commun de l'Entreprise) number, which is Morocco's national business tax identifier.
Listing Detail and Reviews
get_listing_detail accepts a full listing URL from any search result and returns a richer set of fields: rc (RC registration number), ice, email, address, website, director, and geographic coordinates (latitude, longitude). get_listing_reviews takes the same URL format and returns an array of review objects — each with author, content, rating, and date — plus total_reviews and average_rating (null when no reviews exist).
Browsing by Category and Discovery
browse_category accepts a category_slug such as restaurants, climatisation, or cliniques and pages through all businesses in that category nationwide. get_top_activities returns the full list of activity categories available on the platform, each with a name and url. get_top_brands does the same for brands. These two discovery endpoints require no inputs and serve as entry points for building category-level or brand-level scrapers.
The Telecontact API is a managed, monitored endpoint for telecontact.ma — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when telecontact.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 telecontact.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 leads database of Moroccan businesses filtered by city and activity using
search_by_city - Verify a company's legal identity by cross-referencing ICE numbers via
search_by_ice - Reverse-lookup an unknown Moroccan phone number to identify the associated business with
search_by_phone - Aggregate review scores and sentiment for local service providers using
get_listing_reviews - Enrich a CRM with director names, emails, and geolocation by calling
get_listing_detailon matched listings - Map all businesses in a specific category across Morocco using
browse_categorywith pagination - Identify which brands have the most retail representation by iterating
search_by_brandacrossget_top_brandsoutput
| 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 telecontact.ma have an official developer API?+
What fields does `get_listing_detail` return beyond what search results include?+
get_listing_detail returns fields not available in search results: rc (RC registration number), ice (ICE tax number), email, website, director (manager name), and geographic coordinates (latitude, longitude). Search result objects only include name, url, city, and summary.Does the API return opening hours or social media links for listings?+
get_listing_detail covers contact info, legal identifiers, address, and geolocation. You can fork this API on Parse and revise it to add an endpoint that captures opening hours or social media profile links if the listing page exposes them.How does pagination work across search and browse endpoints?+
search_national, search_by_city, browse_category) return 20 results per page. The total field in each response gives the full result count, so you can calculate the number of pages needed by dividing total by 20 and iterating the page parameter.Is coverage limited to Morocco, and can I filter by region rather than specific city?+
search_by_city endpoint requires a named city (e.g., rabat, casablanca) rather than a region or province. Region-level filtering is not currently supported. You can fork this API on Parse and revise it to add a region-based browse endpoint if the source exposes that grouping.