ePRO API Integration Documentation

API endpoints for integrating enforcifyPRO waiver management with ePRO parking system

Client ID Mapping Setup

How to Map ePRO Clients to enforcifyPRO:

Each Client record in enforcifyPRO now has an optional epro_client_id field:

  1. Go to Commercial Clients page
  2. Edit each client that needs ePRO integration
  3. Fill in the ePRO Client ID field
  4. Save the client

API Usage:

When ePRO calls the APIs, they'll use their epro_client_id value. The API will look up the corresponding enforcifyPRO Client record to access quotas, locations, and settings.

Note: If the epro_client_id field is empty, ePRO can still use the enforcifyPRO client_id directly in API calls.

Integration Rationale: Why ePRO as Primary Portal?

The Challenge:

Clients need to manage both:

  • ANPR parking permits (handled by ePRO)
  • Violation waivers (handled by enforcifyPRO)

Why Use ePRO as Single Login Portal:

1. ePRO is Source of Truth for Parking Rules

  • ePRO manages real-time permit status, whitelists, and enforcement rules
  • Clients need to see permit status BEFORE requesting waivers
  • Natural workflow: "Is this plate permitted? No → Request waiver"

2. Better User Experience

  • Single login instead of switching between two systems
  • Unified dashboard showing both permits and waivers
  • Clients see complete parking picture in one place

3. Logical Workflow Integration

  • Step 1: Client checks ANPR monitoring in ePRO
  • Step 2: Sees violation captured
  • Step 3: Requests waiver directly from ePRO interface
  • Step 4: Tracks waiver status alongside permit management

4. Simpler for Operators

  • Operators already train clients on ePRO
  • No need to teach two separate portals
  • Reduced support burden

How It Works:

  • ePRO Portal = Client's primary interface (login, navigation, dashboards)
  • enforcifyPRO APIs = Backend waiver engine (quota, approval workflow, billing)
  • Integration = ePRO calls enforcifyPRO APIs to submit/track waivers
  • Result = Clients manage everything parking-related in one place

Multi-Source Architecture:

This integration is source-agnostic for violations:

  • Violations can come from Inugo ANPR → enforcifyPRO (via lprSubmit API)
  • Violations can come from ePRO ANPR → enforcifyPRO (if configured)
  • Violations can come from Manual Entry → enforcifyPRO (admin UI)
  • Violations can come from Other 3rd Party Systems → enforcifyPRO (custom API)

The waiver APIs only need violation_id and client_id - they don't care about the violation source. This means ePRO can manage permits while enforcifyPRO handles waivers for violations captured by ANY system.

Technical Benefits:

  • Simple REST APIs (no complex OAuth between client browsers)
  • HTTP Basic Auth for server-to-server communication
  • Auto-approval logic for quota management
  • Real-time status updates
Quick Reference

Base URL

https://enforcify-pro-213b978b.base44.app

Authentication

HTTP Basic Auth

Credentials

✓ Configured

Pre-configured in enforcifyPRO secrets: EPRO_API_USERNAME / EPRO_API_PASSWORD

API Endpoints
GET
/api/clientPortalQuota

Check a client's waiver quota and usage for the current month.

Query Parameters:

  • client_id (required) - The enforcifyPRO Client ID (or ePRO Client ID if mapped)

cURL Example:

curl -u "username:password" \
  "https://enforcify-pro-213b978b.base44.app/api/clientPortalQuota?client_id=abc123"
POST
/api/clientPortalWaiverRequest

Submit a waiver request for a violation. Auto-approves if within quota or during grace period.

Request Body:

{
  "client_id": "abc123",
  "violation_id": "violation_xyz",
  "reason": "Guest of hotel - checked in at reception",
  "evidence_urls": [
    "https://example.com/proof.jpg"
  ]
}

cURL Example:

curl -u "username:password" \
  -X POST \
  -H "Content-Type: application/json" \
  -d '{...}' \
  "https://enforcify-pro-213b978b.base44.app/api/clientPortalWaiverRequest"
GET
/api/clientPortalWaiverRequests

Get a list of waiver requests for a client.

Query Parameters:

  • client_id (required) - The enforcifyPRO Client ID (or ePRO Client ID if mapped)
  • status (optional) - Filter by status (pending_approval, approved, denied)
  • limit (optional) - Max results (default: 50)

cURL Example:

curl -u "username:password" \
  "https://enforcify-pro-213b978b.base44.app/api/clientPortalWaiverRequests?client_id=abc123&status=pending_approval&limit=20"
GET
/api/clientPortalWaiverStatus

Get detailed status of a specific waiver request.

Query Parameters:

  • waiver_request_id (required) - The waiver request ID

cURL Example:

curl -u "username:password" \
  "https://enforcify-pro-213b978b.base44.app/api/clientPortalWaiverStatus?waiver_request_id=waiver_124"
Example Integration Flow
1

Check Quota (optional)

Show user if they have quota remaining before submitting waiver.

2

Submit Waiver Request

POST to /api/clientPortalWaiverRequest with violation details and evidence.

3

Show Result

If auto_approved: "Waiver approved!" | If pending: "Awaiting approval - Fee: $X"

4

Poll for Updates (for pending waivers)

GET /api/clientPortalWaiverStatus periodically until status changes.

Important Notes

Auto-Approval Logic: Waivers are auto-approved if within monthly quota or during grace period. Over-quota waivers require admin approval (unless configured otherwise).

Violation Status: When waiver is approved, violation status changes to "waived" and won't appear in payment portal or escalate to collections.

Time Zones: All timestamps are in UTC (ISO 8601 format). Monthly quota resets on 1st of month at 00:00 UTC.

Rate Limits: 100 requests per minute per IP, with burst support of 10 requests per second.

Full API Specification

Complete markdown documentation with all response examples and error codes