Protenders APIprotenders.com ↗
Search and retrieve construction industry companies from Protenders.com. Filter by location, keyword, and category. Access contacts, projects, and certifications.
What is the Protenders API?
The Protenders API gives developers structured access to construction industry company data across two endpoints: search_companies and get_company. A single search request returns up to 1,000 companies per page with fields covering contacts, project counts, primary activities, locations, and certifications. It covers contractors, suppliers, and service providers listed on Protenders.com, one of the larger construction-sector directories in the MENA region and beyond.
curl -X GET 'https://api.parse.bot/scraper/dfa65f6c-fd2f-412b-acde-9a7cbebe76aa/search_companies?page=0&query=MEP&location=Lebanon&hits_per_page=5' \ -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 protenders-com-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: Protenders SDK — search construction companies, drill into details."""
from parse_apis.protenders_companies_api import Protenders, CompanyNotFound
client = Protenders()
# Search for MEP companies in Lebanon — limit caps total items fetched.
for company in client.companies.search(query="MEP", location="Lebanon", limit=5):
print(company.name, company.category, company.projects_count)
# Drill-down: take one result and inspect its contacts.
company = client.companies.search(query="contractor", location="Dubai", limit=1).first()
if company:
print(company.name, company.slug, company.contacts.phone, company.contacts.website)
# Direct lookup by slug — typed error catch for missing companies.
try:
detail = client.companies.get(name="barbanel")
print(detail.name, detail.projects_value, detail.primary_activities)
except CompanyNotFound as exc:
print(f"Company not found: {exc.name}")
print("exercised: companies.search / companies.get / CompanyNotFound catch")
Full-text search across construction industry companies, filterable by location. Returns paginated results with company details including contacts, projects, and activities. Location is a facet filter (country, city, or region name as listed on the site). Omitting location returns all companies matching the query globally. Each page returns up to hits_per_page results; iterate pages 0..total_pages-1 for the full set.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number (0-indexed) |
| query | string | Search keyword to filter companies by name or description |
| location | string | Filter by company location (country, city, or region name as listed on protenders.com). Examples: Lebanon, Dubai, UAE, Saudi Arabia, Qatar |
| hits_per_page | integer | Number of results per page (max 1000) |
{
"type": "object",
"fields": {
"page": "integer - current page number",
"total": "integer - total number of matching companies",
"companies": "array of company objects with id, name, slug, profile, category, locations, contacts, primary_activities, projects_count, and more",
"total_pages": "integer - total number of pages",
"hits_per_page": "integer - results per page"
},
"sample": {
"data": {
"page": 0,
"total": 14,
"companies": [
{
"id": "131810",
"name": "MEP Team Pro",
"slug": "mep-team-pro",
"state": "registered",
"profile": "MEP Team Pro specializes in providing top-tier consultancy services...",
"branches": "",
"category": "Consultant",
"contacts": {
"email": "[email protected]",
"phone": "96171212368",
"website": "www.mepteam.pro"
},
"locations": [
"Lebanon",
"Mount Lebanon Governorate",
null
],
"team_size": 0,
"membership": "presence",
"certificates": [],
"main_address": null,
"logo_public_id": "0607f8566f24cad2f48d021d45e71a1a.png",
"projects_count": 0,
"projects_value": "",
"projects_sectors": [],
"primary_activities": [],
"secondary_activities": [],
"ongoing_projects_count": 0,
"ongoing_projects_value": ""
}
],
"total_pages": 3,
"hits_per_page": 5
},
"status": "success"
}
}About the Protenders API
Searching Companies
The search_companies endpoint accepts a query string for name or description matching, a location filter (country, city, or region), and a hits_per_page value up to 1,000. Results are zero-indexed via the page parameter, and the response includes total and total_pages so you can walk the full result set. Each item in the companies array carries id, name, slug, profile, category, locations, contacts, primary_activities, and projects_count.
Retrieving a Specific Company
The get_company endpoint takes a name or slug string and returns the single best-matching record with the full detail object. This includes all fields from search results plus certifications and a more complete activity breakdown. It is suited for enrichment workflows where you already have a company name and want the canonical Protenders record.
Data Shape and Coverage
Contact data returned in the contacts field varies by company; some records include phone, email, and website entries while others carry only partial information depending on what the company has published on Protenders. The primary_activities field reflects the construction disciplines the company has self-reported (e.g., general contracting, MEP, fit-out). Coverage is strongest for MENA-region companies, though the directory includes firms from other geographies as well.
The Protenders API is a managed, monitored endpoint for protenders.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when protenders.com 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 protenders.com 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 subcontractor discovery tool filtered by country or city using the
locationparameter insearch_companies - Enrich a CRM with verified contact details by calling
get_companyfor each firm in your prospect list - Map the construction supply chain in a specific region by aggregating
primary_activitiesacross paginated search results - Identify contractors by specialization using the
queryfilter and inspecting returnedcategoryandprimary_activitiesfields - Track project activity volume by comparing
projects_countacross companies returned from a keyword search - Generate qualified lead lists for construction equipment or materials sales by filtering on location and category
| 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 Protenders offer an official developer API?+
What does the `search_companies` endpoint return beyond a company name?+
id, name, slug, profile, category, locations, contacts, primary_activities, projects_count, and pagination metadata (total, total_pages, hits_per_page). The contacts and primary_activities fields are arrays whose completeness depends on what each company has listed on Protenders.Does the API return individual project details for each company?+
projects_count integer per company but does not expose individual project records, project names, values, or dates. You can fork this API on Parse and revise it to add an endpoint that retrieves per-project details for a given company.Is there a way to filter companies by construction specialization or trade?+
query parameter in search_companies can target company names and descriptions, and the response includes category and primary_activities fields you can filter client-side. There is no dedicated category filter parameter on the endpoint itself. You can fork this API on Parse and revise it to add a category-specific filter parameter.How does pagination work, and what is the maximum page size?+
page parameter is zero-indexed, so the first page is page=0. The hits_per_page parameter caps at 1,000 results per request. The response includes total and total_pages fields so you can determine how many additional requests are needed to retrieve the full result set for a given query.