Getting Started

PermitsData API gives you access to building permit records, inspections, code violations, and contractor data for Salem, Oregon through a simple REST API.

Quick Start

1. Create an account

Sign up for free to get 100 API requests per month. No credit card required.

2. Get your API key

After confirming your email, create an API key in your dashboard. Your key will start with pdi_.

3. Make your first request

Search for building permits by address:

curl -H "X-API-Key: pdi_your_key_here" \
  "https://api.permitsdata.com/v1/permits/search?address=123+Main+St&type=residential"

Authentication

All API requests require an API key passed via the X-API-Key header. API keys start with the prefix pdi_.

Authentication Header
curl -H "X-API-Key: pdi_your_key_here" \
  "https://api.permitsdata.com/v1/permits/search?address=123+Main+St"

Base URL

All API requests should be made to:

https://api.permitsdata.com

Permits

Search and retrieve building permit records.

Permits Endpoints
GET /v1/permits/search
  ?address=123 Main St       # Street address (partial match)
  &type=residential           # Permit type filter
  &status=issued              # Status filter (issued, pending, expired, etc.)
  &date_from=2024-01-01       # Issued after this date
  &date_to=2024-12-31         # Issued before this date
  &page=1                     # Pagination (default: 1)
  &per_page=25                # Results per page (default: 25, max: 100)

GET /v1/permits/{permit_number}   # Get a single permit by number

Permit Response Fields

FieldTypeDescription
permit_numberstringUnique permit identifier
typestringPermit type (Residential, Commercial, etc.)
statusstringCurrent status
addressstringProperty address
descriptionstringWork description
valuationnumberEstimated project value in USD
issued_datestringDate permit was issued (ISO 8601)
applicantstringApplicant name

Inspections

Access inspection records linked to permits.

Inspections Endpoints
GET /v1/inspections/search
  ?permit_number=BLD-2024-00142   # Filter by permit
  &address=123 Main St            # Filter by address
  &result=pass                    # Filter by result (pass, fail, partial)
  &date_from=2024-01-01           # After this date
  &page=1

GET /v1/inspections/{id}          # Get a single inspection

Violations

Look up code enforcement violations.

Violations Endpoints
GET /v1/violations/search
  ?address=123 Main St            # Filter by address
  &case_number=CE-2024-001        # Filter by case number
  &status=open                    # Filter by status (open, closed, resolved)
  &page=1

GET /v1/violations/{case_number}  # Get a single violation

Contractors

Search licensed contractors.

Contractors Endpoints
GET /v1/contractors/search
  ?name=Smith                     # Search by name (partial match)
  &license_number=CCB-12345       # Filter by license number
  &trade=plumbing                 # Filter by trade type
  &status=active                  # Filter by license status
  &page=1

GET /v1/contractors/{license_number}  # Get a single contractor

Response Format

All successful responses follow a consistent format with a data wrapper:

Success Response (List)
{
  "data": [
    {
      "permit_number": "BLD-2024-00142",
      "type": "Residential",
      "status": "Issued",
      "address": "123 Main St",
      ...
    }
  ],
  "pagination": {
    "page": 1,
    "per_page": 25,
    "total": 142
  }
}

Errors return a detail field:

Error Response
{
  "detail": "Invalid API key"
}

Rate Limits

Rate limits are enforced per API key. The limits depend on your plan:

PlanMonthly LimitRate Limit
Free100 requests5 req/min
Basic2,500 requests30 req/min
Pro25,000 requests120 req/min
Enterprise250,000 requests500 req/min

When you exceed your rate limit, the API returns a 429 Too Many Requests response with a Retry-After header.

Error Codes

CodeMeaning
400Bad request -- invalid parameters
401Unauthorized -- missing or invalid API key
403Forbidden -- insufficient permissions
404Not found -- resource does not exist
429Too many requests -- rate limit exceeded
500Internal server error