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

  1. 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.
  2. 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) or 403 {"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

StatusMeaning
400Validation error (details has field-level info) or bad format
401Missing/invalid/revoked API key
403Access denied (cross-company), or subscription required
404Project not found
429Rate limit exceeded (see Retry-After)
500Our side. Retry with backoff, report if persistent

Questions? Email support@pro-paving.com and we'll help you get integrated.