API Reference
The ProPaving Partner API (v1) lets you pull your company's projects, measurements, geometry exports, and proposal PDFs into your own software. Read-first: the only write in v1 is project creation.
Base URL: https://pro-paving.com
Authentication
- A company owner or admin creates a key in the ProPaving app under Settings → API Keys. The full key (
pk_live_...) is shown once at creation, so store it in your secrets manager. Only a SHA-256 hash is kept on our side. - Send the key as a Bearer token on every request:
curl https://pro-paving.com/api/projects \
-H "Authorization: Bearer pk_live_YOUR_KEY"- Every key belongs to one company and can only ever see that company's data.
- Revoking a key (Settings → API Keys) takes effect immediately.
- A missing, malformed, unknown, or revoked key gets
401 {"error": "Invalid API key"}. - Requests for a project outside your company return
404(unknown id) or403 {"error": "Access denied"}.
Rate Limit
120 requests per minute per key. Over the limit you get 429 with a Retry-After header and X-RateLimit-* headers describing the window.
Subscription
Project and measurement reads work on any account. Exports and proposal PDFs require an active ProPaving subscription (403 otherwise), the same rule as in the app.
Endpoints
List Projects
curl "https://pro-paving.com/api/projects?search=&page=1&limit=50" \
-H "Authorization: Bearer pk_live_YOUR_KEY"Query params: search (matches name/address), sortBy (name|updatedAt|createdAt|address), sortOrder (asc|desc), page, limit (max 100).
Returns { projects: [...], pagination: {...} }. Each project includes its measurements (GeoJSON geometry, squareFeet, perimeter, linearFeet, color, notes, category id), plus totalSquareFeet, totalLinearFeet, and measurementCount.
Create a Project
curl -X POST https://pro-paving.com/api/projects \
-H "Authorization: Bearer pk_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Maple St Resurfacing",
"address": "123 Maple St, Springfield, IL",
"customerName": "Springfield HOA",
"customerEmail": "board@example.com"
}'Body fields: name (required), address, notes, centerLat, centerLng, zoom, customerName, customerAddress, customerEmail, projectType. Returns 201 { project }.
Typical flow: create the project here with the job address, then a ProPaving user opens it in the app (web or mobile) and measures it. Your software polls the project until measurements appear.
Project Detail
curl https://pro-paving.com/api/projects/PROJECT_ID \
-H "Authorization: Bearer pk_live_YOUR_KEY"Returns the full project: measurements with per-measurement materialEstimate, category cost attributes, geometry, plus project-level materialEstimates, totalMaterialCost, and proposal-acceptance state.
Measurements
curl https://pro-paving.com/api/projects/PROJECT_ID/measurements \
-H "Authorization: Bearer pk_live_YOUR_KEY"Returns { measurements: [...] }, each with type (AREA|LINEAR), GeoJSON geometry, squareFeet, perimeter, linearFeet, cutouts, color, notes.
Geometry Export (GeoJSON / KML / KMZ / DXF)
curl -o site.geojson \
"https://pro-paving.com/api/projects/PROJECT_ID/export?format=geojson" \
-H "Authorization: Bearer pk_live_YOUR_KEY"format is one of geojson, kml, kmz, dxf. Returns the file as an attachment. Requires an active subscription.
Proposal PDF
curl -o proposal.pdf \
"https://pro-paving.com/api/projects/PROJECT_ID/report" \
-H "Authorization: Bearer pk_live_YOUR_KEY"Optional ?depthInches=3 overrides asphalt thickness for tonnage math (0-24). Returns the rendered proposal PDF. Requires an active subscription. PDF rendering takes a few seconds, so don't put this call in a hot path.
What the API Does NOT Do (v1)
- Create measurements. Measuring happens in the ProPaving app: a person looks at the imagery and draws or taps the paved area. The API surfaces what has been measured; it does not measure from an address by itself.
- Webhooks/push. Poll
GET /api/projects(e.g. on job-folder open); the rate limit comfortably covers polling every few seconds. - Manage keys, team, or billing.
Errors
| Status | Meaning |
|---|---|
400 | Validation error (details has field-level info) or bad format |
401 | Missing/invalid/revoked API key |
403 | Access denied (cross-company), or subscription required |
404 | Project not found |
429 | Rate limit exceeded (see Retry-After) |
500 | Our side. Retry with backoff, report if persistent |
Questions? Email support@pro-paving.com and we'll help you get integrated.