PropGap Pro Workspace — For Licensed Tax Professionals Only
API Reference
PropGap Pro Open API
Export batch results to your CRM, case management system, or spreadsheet. All endpoints require your firm’s access key as authentication.
Authentication
All API endpoints accept your access key either as a query parameter or an HTTP header. The key format is PG-XXXXXXXX.
# Query parameter (easiest for testing) GET /api/pro/export/[jobId]?accessKey=PG-YOURKEY # Header (recommended for production) GET /api/pro/export/[jobId] x-access-key: PG-YOURKEY
/api/pro/export/[jobId]Returns full batch results as structured JSON. Use this to pipe PropGap data into your CRM, billing system, or reporting workflow.
Parameters
| Parameter | Type | Description |
|---|---|---|
| jobId | path | UUID of the batch job (from batch results URL) |
| accessKey | query / header | Your firm access key |
Example Request
curl "https://propgap.ai/api/pro/export/YOUR-JOB-UUID?accessKey=PG-YOURKEY"
Response Schema
{
"meta": {
"jobId": "uuid",
"firmName": "Smith & Associates LLC",
"totalProperties": 20,
"successCount": 15,
"exportedAt": "2026-03-25T12:00:00Z",
"disclaimer": "Tax rates are statewide averages..."
},
"results": [
{
"address": "123 Main St, Newark, NJ 07102",
"assessedValue": 450000,
"status": "success", // success | no_gap | no_comps | error
"taxGap": 3200, // annual tax overpayment ($)
"medianCompMV": 380000, // median comparable sale price
"compCount": 8,
"outcome": "filed", // filed | won | settled | denied | withdrew | pending
"outcomeNotes": "Hearing 4/10",
"shareUrl": "https://propgap.ai/pro/share/uuid",
"evidenceKitUrl": "https://propgap.ai/api/pdf/evidence-packet?auditId=uuid&proKey=PG-KEY",
"errorMessage": null
}
]
}/api/pro/analyticsAggregate outcome statistics for your firm — win rate, total gap, monthly trend, by-state breakdown.
curl "https://propgap.ai/api/pro/analytics?accessKey=PG-YOURKEY"
Response
{
"firm": { "name": "Smith LLC", "status": "active", "memberSince": "2026-01-15" },
"totals": { "properties": 200, "gapsFound": 145, "totalGap": 580000, "batches": 12 },
"outcomes": { "won": 40, "settled": 25, "filed": 60, "denied": 8, "withdrew": 5, "pending": 7 },
"winRate": 72,
"estimatedRecovered": 225000,
"byState": { "NJ": { "gapsFound": 90, "totalGap": 360000, "won": 28, "settled": 18 } },
"monthlyTrend": [{ "month": "2026-01", "batches": 2, "gapsFound": 18, "totalGap": 72000 }]
}/api/pro/batch/historyLists all batch jobs for your access key with summary stats.
curl "https://propgap.ai/api/pro/batch/history?accessKey=PG-YOURKEY"
# Response
{
"jobs": [
{
"id": "uuid",
"created_at": "2026-03-20T10:00:00Z",
"status": "completed",
"total_count": 20,
"completed_count": 20,
"success_count": 15
}
],
"totalGapByJob": { "uuid": 48000 }
}/api/pro/batch/outcomeUpdate the appeal outcome for a result. Call this from your case management system when a hearing concludes.
curl -X PATCH "https://propgap.ai/api/pro/batch/outcome" \
-H "Content-Type: application/json" \
-d '{
"resultId": "uuid",
"accessKey": "PG-YOURKEY",
"outcome": "won",
"notes": "Board reduced AV from $450k to $390k"
}'
# Valid outcomes: filed | won | settled | denied | withdrew | pending/api/pro/pipelineReturns all results across every batch that have a hearing date set — useful for building a calendar view or deadline tracker.
curl "https://propgap.ai/api/pro/pipeline?accessKey=PG-YOURKEY"
# Response
{
"results": [
{
"id": "uuid",
"job_id": "uuid",
"address": "123 Main St, Newark, NJ 07102",
"assessed_value": 450000,
"tax_gap": 3200,
"outcome": "filed",
"filed_date": "2026-02-15",
"hearing_date": "2026-04-10",
"decision_date": null,
"tax_savings_realized": null,
"batchLabel": "March 2026 Upload"
}
]
}/api/pro/portfolioCross-batch aggregate stats, top 50 properties by gap size, and at-risk cases (hearing within 14 days with no final outcome).
curl "https://propgap.ai/api/pro/portfolio?accessKey=PG-YOURKEY"
# Response
{
"stats": {
"total": 200,
"gapCount": 145,
"totalGap": 580000,
"realizedSavings": 225000
},
"topProperties": [ /* top 50 by tax_gap, same shape as pipeline results */ ],
"atRisk": [ /* hearing_date within 14 days, no won/settled/denied outcome */ ]
}/api/pro/batch/progressReturns the most recent in-progress or recently completed batch job. Poll at 1–2s intervals while a batch is running to drive a progress bar.
curl "https://propgap.ai/api/pro/batch/progress?accessKey=PG-YOURKEY"
# Response (while processing)
{
"job": {
"id": "uuid",
"status": "processing", // processing | completed | failed
"totalCount": 20,
"completedCount": 12,
"pct": 60
}
}
# Response (no active job)
{ "job": null }/api/pro/batch/archiveArchive or unarchive a batch job. Archived jobs are hidden from the default history view but remain accessible.
curl -X PATCH "https://propgap.ai/api/pro/batch/archive" \
-H "Content-Type: application/json" \
-d '{
"jobId": "uuid",
"accessKey": "PG-YOURKEY",
"archived": true
}'
# Response
{ "ok": true }/api/pro/batch/internal-notesSave internal notes for a result row. Notes are firm-only and never visible to homeowners on the share page.
curl -X PATCH "https://propgap.ai/api/pro/batch/internal-notes" \
-H "Content-Type: application/json" \
-d '{
"resultId": "uuid",
"accessKey": "PG-YOURKEY",
"notes": "Owner prefers email. Deadline April 1."
}'
# Response
{ "ok": true }/api/pro/share/intentCalled by the homeowner-facing share page when a client submits their contact info. Saves the lead to the result row and fires an email to the firm. Deduplicates — subsequent calls for the same result are no-ops.
curl -X POST "https://propgap.ai/api/pro/share/intent" \
-H "Content-Type: application/json" \
-d '{
"resultId": "uuid",
"name": "Jane Smith",
"email": "jane@example.com",
"phone": "201-555-1234" // optional
}'
# Response (first submission)
{ "ok": true }
# Response (duplicate)
{ "ok": true, "alreadySubmitted": true }Zapier / Make Integration
No native Zapier app yet — use the Webhook trigger pattern with the export endpoint. Here’s a common setup:
- In your CRM (Clio, MyCase, etc.), create an automation on new matter creation.
- Add a webhook step that calls
GET /api/pro/export/[jobId]with your access key. - Map the
taxGap,shareUrl, andevidenceKitUrlfields to your matter record. - Set up a second webhook to PATCH the outcome back to PropGap when you mark a matter resolved.
Need a native Zapier app or Make template? info@propgap.ai — we’re building integrations based on demand.
Rate Limits & SLA
| Endpoint | Limit | Notes |
|---|---|---|
| POST /api/pro/batch | 10/batch (trial) · 30/batch (active) | Intentionally capped — run one batch per county or client group for clean error management |
| GET /api/pro/export | Unlimited | Read-only, no rate limit |
| GET /api/pro/analytics | Unlimited | Read-only, no rate limit |
| PATCH /api/pro/batch/outcome | Unlimited | Write access requires valid accessKey |
| GET /api/pro/pipeline | Unlimited | Read-only, no rate limit |
| GET /api/pro/portfolio | Unlimited | Read-only, no rate limit |
| GET /api/pro/batch/progress | Unlimited | Designed for 1–2s polling; no rate limit |
| PATCH /api/pro/batch/archive | Unlimited | Write access requires valid accessKey |
| PATCH /api/pro/batch/internal-notes | Unlimited | Write access requires valid accessKey |
| POST /api/pro/share/intent | 1 per result | Deduplicates by resultId — subsequent calls are no-ops |
Questions or custom integration needs? info@propgap.ai