Procore APIprocore.com ↗
Search construction projects, bids, and company profiles from the Procore Construction Network. Get bid due dates, trades, funding type, and full company details.
What is the Procore API?
The Procore Construction Network API exposes 4 endpoints covering construction project bids and contractor company profiles. Use search_projects to find active bids filtered by keyword, funding type, and location, then retrieve full project scope, bidding instructions, and point-of-contact email via get_project_details. Company discovery is equally structured, with service categories, coverage areas, and business classifications returned per profile.
curl -X GET 'https://api.parse.bot/scraper/104087f7-d4a7-45ef-a18f-4bfc5715e762/search_projects?page=1&sort=last_updated&query=electrical&page_size=10&funding_type=public' \ -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 procore-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: Procore Construction Network SDK — search projects and companies, drill into details."""
from parse_apis.procore_construction_network_api import (
Procore, FundingType, ResourceNotFound
)
client = Procore()
# Search for public electrical projects, cap at 3 results
for project in client.projects.search(query="electrical", funding_type=FundingType.PUBLIC, limit=3):
print(project.title, project.company_name, project.open)
# Drill into the first project's full details
project = client.projects.search(query="electrical", limit=1).first()
if project:
detail = project.details()
print(detail.name, detail.funding_type, detail.point_of_contact_email)
# Search for plumbing companies
for company in client.companies.search(query="plumbing", limit=3):
print(company.name, company.website, company.construction_sectors)
# Get full company detail via drill-down
company = client.companies.search(query="plumbing", limit=1).first()
if company:
try:
info = company.details()
print(info.name, info.phone, info.primary_address.city if info.primary_address else "N/A")
for svc in info.provided_services:
print(svc.key, svc.name)
except ResourceNotFound as exc:
print(f"Company not found: {exc.slug}")
print("exercised: projects.search / project.details / companies.search / company.details")
Search for construction projects and bids on the Procore Construction Network. Returns project data including titles, locations, bid due dates, solicitor information, and trade classifications. When a query is provided, results are filtered by keyword match against project titles and scopes. Without a query, returns all recent projects. Paginates via page number.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number for pagination. |
| sort | string | Sort order for results. |
| query | string | Search keyword for projects (e.g. 'electrical', 'plumbing'). When omitted, returns all recent projects. |
| page_size | integer | Number of results per page. |
| funding_type | string | Filter by funding type: 'public' or 'private'. |
{
"type": "object",
"fields": {
"count": "integer total number of matching projects",
"results": "array of project objects",
"finalRadius": "integer search radius used"
},
"sample": {
"data": {
"count": 3,
"results": [
{
"open": false,
"title": "Grand Arena Bid",
"bidDueDate": null,
"companyName": "CALTEC Corporation",
"fundingType": "public",
"primarySlug": "8096_1337828_grand-arena-bid",
"bidEmailMessage": "The Scope of Work is as follows...",
"projectLocation": {
"zip": "91744",
"city": "City of Industry",
"address": "16200 Temple Avenue",
"stateCode": "CA"
},
"tradesAndServices": [
{
"pcn_trade_key": "electrical",
"pcn_trade_level": "trade"
}
]
}
],
"finalRadius": 0
},
"status": "success"
}
}About the Procore API
Project Search and Bid Discovery
The search_projects endpoint accepts a query keyword (e.g. 'electrical', 'plumbing'), a funding_type filter ('public' or 'private'), and standard page/page_size pagination. Each result in the results array includes title, projectLocation, bidDueDate, companyName, fundingType, tradesAndServices, and a primarySlug you can pass directly to get_project_details. The count field tells you the total number of matching bids across all pages.
Project Detail
get_project_details takes the slug from search results and returns the full project record. Key fields include projectDescription and biddingInstructions (both HTML), bidDueDate as an ISO date string, pointOfContactEmail, the open boolean indicating whether the project is still accepting bids, and a tradesAndServices array with typed trade keys. The location object provides city, state code, street address, and ZIP.
Company Search and Profiles
search_companies queries the contractor directory by keyword and returns count plus a results array with name, primarySlug, about, businessTypes, constructionSectors, providedServices, addresses, and website. Passing a slug from those results to get_company_details returns the full profile, adding phone, primaryAddress (city, province, postal code), coverageAreas as geographic objects, and a providedServices array with key, name, and type per entry.
Pagination and Filtering
Both search endpoints support page and sort parameters. The page_size parameter applies when no query is provided. The finalRadius field in search responses reports the geographic radius that was used to scope results, which can differ from any implicit default depending on the query.
The Procore API is a managed, monitored endpoint for procore.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when procore.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 procore.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?+
- Monitor newly posted public bids by polling
search_projectswithfunding_type='public'and checkingbidDueDatefields. - Build a subcontractor matching tool by querying
search_companiesfor a trade keyword and filtering results byconstructionSectorsandprovidedServices. - Aggregate bid contact information by extracting
pointOfContactEmailandcompanyNamefromget_project_detailsresponses at scale. - Track which trades are required across active projects by collecting
tradesAndServicesarrays fromsearch_projectsresults. - Qualify GC or sub partners by pulling full company profiles via
get_company_detailsto inspectbusinessTypes,coverageAreas, andwebsite. - Identify private vs. public construction activity in a region by filtering
search_projectsresults on thefundingTypefield. - Cross-reference a company's stated coverage against project locations by joining
coverageAreasfromget_company_detailswithprojectLocationfrom project search results.
| 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 Procore offer an official developer API?+
What does `get_project_details` return that `search_projects` does not?+
search_projects returns summary fields: title, bidDueDate, companyName, fundingType, and tradesAndServices. get_project_details adds the full projectDescription (HTML), biddingInstructions (HTML), pointOfContactEmail, a structured location object with street address and ZIP, and the open boolean indicating current bid status.Can I filter `search_projects` by trade type or geographic radius?+
query parameter (e.g. 'electrical', 'concrete') and by funding_type ('public' or 'private'). Direct filtering by trade category or by an explicit radius is not a supported input parameter — the finalRadius field in the response reports the radius the search applied, but it is not user-controlled. You can fork the API on Parse and revise it to add a geographic or trade-specific filter endpoint.Are company profiles always available via `get_company_details`?+
primarySlug required for the call comes from search_companies results, so profiles that do not appear in search are also not reachable.Does the API expose bid documents or attachments linked to a project?+
projectDescription, biddingInstructions, pointOfContactEmail, and tradesAndServices — but does not return downloadable plan sets or attached bid documents. You can fork the API on Parse and revise it to add an endpoint that retrieves document links if they are present on a project's detail page.