Com APIyellowpages.com.eg ↗
Search yellowpages.com.eg business listings by keyword and location. Returns company name, address, phone numbers, website, WhatsApp, and categories for Egyptian businesses.
What is the Com API?
The yellowpages.com.eg API provides a single search_listings endpoint that queries Egypt's Yellow Pages directory and returns up to 20 business listings per page, each carrying up to 12 fields including company title, address, phone numbers, website, WhatsApp availability, business categories, and keywords. One request resolves your location input against the site's known cities, areas, and districts and returns the normalised heading, pagination state, and total result count.
curl -X GET 'https://api.parse.bot/scraper/5005270d-dc2b-4f8f-a413-008d066d17e7/search_listings?keyword=advertising+machinery+%26+supplies&location=Cairo' \ -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 yellowpages-com-eg-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: Egypt Yellow Pages — search listings by keyword and location."""
from parse_apis.yellowpages_com_eg_api import YellowPages, InputNotFound
client = YellowPages()
# Get the full search result wrapper to inspect metadata first.
result = client.search_results.search(keyword="restaurants", location="Cairo")
print(f"{result.heading} — {result.total_results} results found")
print(f"Location resolved: {result.location.label} ({result.location.type})")
# Iterate listings with automatic pagination; limit= caps total items fetched.
for listing in client.listings.search(keyword="restaurants", location="Cairo", limit=5):
print(f"{listing.title} — {listing.address}")
if listing.phones:
print(f" Phones: {', '.join(listing.phones)}")
if listing.website:
print(f" Website: {listing.website}")
# Drill-down: grab one listing to inspect its full details.
hit = client.listings.search(keyword="printing", location="Maadi", limit=1).first()
if hit is not None:
print(f"\n{hit.title} (ID: {hit.company_id})")
print(f" Categories: {', '.join(hit.categories)}")
if hit.whatsapp:
print(f" WhatsApp: {hit.whatsapp}")
# Handle a location the site cannot resolve.
try:
client.search_results.search(keyword="plumbing", location="xx")
except InputNotFound as e:
print(f"Not found: {e.message}")
print("exercised: search_results.search / listings.search / InputNotFound")
Searches the Egypt Yellow Pages directory for businesses matching a keyword (company name, category, brand or keyword) in a city, area or district, and returns one page of listings (20 per page) exactly as the site's search results page shows them. The location is resolved against the site's own place suggestions: an exact (case-insensitive) label match is preferred, otherwise the first suggestion is used, and the resolved place is reported in `location` (with `matched_exactly`); a location the site does not know at all is rejected with stale_input. Each listing carries the business title, its `company_id` (the stable site identifier), profile URL, street address, categories, keywords, website, WhatsApp number, logo, whether it has additional branches and whether the site offers an email contact form for it. The site does not publish business email addresses (only a contact form), so no email address is returned. Phone numbers are not embedded in the results page; when `include_phones` is true (the default) one extra lightweight lookup is made per listing (up to 20 per page), so a call costs about 22 requests; with `include_phones=false` the call costs 2 requests and `phones`/`other_numbers` are null. Any listing whose phone lookup failed is listed in `phone_lookup_failures`. `total_results` and `has_next` come from the site; paginate with `page` while `has_next` is true. Note: requesting a page beyond the last one makes the site broaden the search to related results (with a much larger `total_results`), mirroring the website's behaviour, so stop at `has_next=false`. A keyword the site cannot match still returns the site's closest fuzzy matches rather than an empty list.
| Param | Type | Description |
|---|---|---|
| page | integer | 1-based results page number; the site serves 20 listings per page. |
| keywordrequired | string | What to search for: a business category, company name, brand or keyword, at least 2 characters (e.g. one shape: a category name such as a machinery-and-supplies category). |
| locationrequired | string | City, area or district name in Egypt as the site knows it (e.g. a city name or an area name), at least 2 characters. Resolved against the site's place suggestions; the resolved place is echoed in the response. |
| include_phones | boolean | When true, phone numbers are looked up for every listing on the page (one extra request each). When false, `phones` and `other_numbers` are null and the call is much cheaper. |
{
"type": "object",
"fields": {
"page": "integer, the requested page number",
"heading": "the results page heading, e.g. '<keyword> in <place>'",
"keyword": "the search term as the site normalised it (category/keyword label when it recognised one)",
"has_next": "boolean, true when the site offers a next page",
"listings": "array of listing objects: company_id (string, stable site id), title, profile_url, address (string or null), has_branches (boolean), categories (array of strings), keywords (array of strings), website (string or null), has_email_contact (boolean; the site exposes only a contact form, never the address), whatsapp (string or null, international format), logo_url (string or null), phones (array of strings, or null when include_phones=false), other_numbers (array of additional numbers the site lists separately from the main phones, e.g. fax; null when include_phones=false)",
"location": "object: resolved place with label, type (City | Area | District as reported by the site) and matched_exactly (true when the label equals the supplied location, case-insensitively)",
"page_size": "integer, listings per page (20)",
"total_results": "integer, total matching listings reported by the site for this search",
"phone_lookup_failures": "array of company_id values whose phone lookup did not return numbers (empty when all succeeded or when include_phones=false)"
},
"sample": {
"data": {
"page": 1,
"heading": "Advertising Machinery & Supplies in Cairo",
"keyword": "Advertising Machinery & Supplies",
"has_next": true,
"listings": [
{
"title": "Mak Printing Solutions",
"phones": [
"+1 (555) 012-3456",
"+1 (555) 012-3456",
"+1 (555) 012-3456"
],
"address": "123 Main St, Springfield, IL 62704",
"website": "http://www.makprinteg.com/",
"keywords": [
"Indoor Printers",
"Printing Machine",
"Outdoor Printing Machine"
],
"logo_url": "https://cdn.yellowpages.com.eg/static/modules/uploads/logos/mak-printing-solutions-logo_474418_2022_sh_3477_36348.jpg?25",
"whatsapp": "+1 (555) 012-3456",
"categories": [
"Advertising Machinery & Supplies",
"Printing & Equipment"
],
"company_id": "708198",
"profile_url": "https://yellowpages.com.eg/en/profile/mak-printing-solutions/708198",
"has_branches": true,
"other_numbers": [],
"has_email_contact": true
},
{
"title": "24 Support - VASE",
"phones": [
"+1 (555) 012-3456",
"+1 (555) 012-3456",
"+1 (555) 012-3456"
],
"address": "123 Main St, Springfield, IL 62704",
"website": null,
"keywords": [],
"logo_url": null,
"whatsapp": null,
"categories": [
"Advertising Machinery & Supplies",
"Printing & Equipment"
],
"company_id": "489051",
"profile_url": "https://yellowpages.com.eg/en/profile/24-support-_-vase/489051",
"has_branches": false,
"other_numbers": [],
"has_email_contact": true
}
],
"location": {
"type": "City",
"label": "CAIRO",
"matched_exactly": true
},
"page_size": 20,
"total_results": 38,
"phone_lookup_failures": []
},
"status": "success"
}
}About the Com API
What the API Returns
The search_listings endpoint accepts a keyword (business category, company name, brand, or search term) and a location (city, area, or district in Egypt) and returns one page of 20 listings matching that query. Each listing object includes company_id, title, profile_url, address, has_branches, and availability of contact channels such as website, WhatsApp, and phone. The response also exposes a location object that tells you the resolved place label, its type (City, Area, or District), and whether it was matched exactly.
Phone Number Lookup
Phone numbers are not returned by default. Set include_phones=true to trigger a per-listing lookup that populates the phones field on each listing. Any company IDs where the lookup did not return numbers are collected in the phone_lookup_failures array so you know exactly which records are incomplete. Be aware that enabling phone lookup increases response time proportionally to the number of listings on the page.
Pagination and Result Metadata
Use the page parameter (1-based) to walk through result sets. The response includes total_results (the site's reported count for the query), page_size (always 20), and has_next (a boolean indicating whether a subsequent page exists). The keyword field in the response reflects how the site normalised your input — for example, it may return a recognised category label rather than the raw string you submitted.
Coverage and Limitations
Coverage is limited to businesses listed on yellowpages.com.eg. Location resolution depends on the site's own place index, so obscure sub-areas may not match exactly — check matched_exactly on the location object to verify. The API returns data for search result pages only; individual business profile pages (full descriptions, photos, reviews) are not included in the current response shape.
The Com API is a managed, monitored endpoint for yellowpages.com.eg — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when yellowpages.com.eg 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 yellowpages.com.eg 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 supplier discovery tool for Egyptian businesses by searching categories like 'logistics' or 'manufacturing' in specific cities
- Collect phone numbers and WhatsApp availability for sales outreach lists using include_phones=true
- Verify whether a company has branches in multiple locations using the has_branches field
- Aggregate business counts by category and area using total_results across multiple location queries
- Enrich a CRM with Egyptian company addresses, websites, and contact channels from profile_url data
- Monitor which businesses appear for a given keyword-and-location pair over time using company_id as a stable identifier
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.