API Documentation

UR Power API

Integrate your services with Detroit's community empowerment platform. Manage programs, referrals, forms, and member data through a secure RESTful API.

Base URL: https://urpower.org/api/v1

Quick Start

1

Register

Create a partner account at urpower.org/partner/join

2

Get Verified

The UR Power team reviews and verifies your organization

3

Generate a Key

Create an API key from your partner dashboard

4

Start Building

Make authenticated requests to any endpoint

Authentication

All API requests must include an API key in the Authorization header. Keys are generated from your partner dashboard and can be scoped to specific permissions.

Example Request
curl -X GET https://urpower.org/api/v1/programs \
  -H "Authorization: Bearer urp_sk_a1b2c3d4e5f6g7h8i9j0" \
  -H "Content-Type: application/json"
Bearer Token
All requests use Authorization: Bearer urp_xxxxx
Scoped Permissions
Keys can be limited to specific resources
Rate Limited
1,000 requests per hour per API key
JSON Only
All requests and responses use application/json

Endpoints

Click any group to expand its endpoints. Each endpoint shows the required scope, request format, and example response.

Info Bank Fields

The Info Bank stores structured member data that members can selectively share with partner organizations. Only fields the member has consented to share will be returned. Below is the full schema grouped by section.

Personal

FieldTypeDescription
first_namestringMember first name
last_namestringMember last name
date_of_birthdateDate of birth (YYYY-MM-DD)
phonestringPrimary phone number
emailstringPrimary email address
preferred_languagestringPreferred language for communication

Household

FieldTypeDescription
household_sizeintegerTotal people in household
dependents_under_18integerNumber of dependents under 18
marital_statusstringsingle, married, divorced, widowed, separated
veteran_statusbooleanWhether any household member is a veteran

Income

FieldTypeDescription
annual_incomenumberTotal annual household income
income_sourcestringemployment, self_employed, disability, retirement, other
employerstringCurrent employer name
pay_frequencystringweekly, biweekly, monthly

Housing

FieldTypeDescription
housing_statusstringown, rent, shelter, unhoused, transitional
addressstringCurrent street address
citystringCity
statestringState
zipstringZIP code
monthly_housing_costnumberMonthly rent or mortgage payment

Benefits

FieldTypeDescription
snapbooleanCurrently receiving SNAP/food assistance
tanfbooleanCurrently receiving TANF
wicbooleanCurrently receiving WIC
ssi_ssdibooleanCurrently receiving SSI or SSDI
section_8booleanCurrently receiving Section 8/housing voucher
medicaidbooleanCurrently enrolled in Medicaid

Healthcare

FieldTypeDescription
has_insurancebooleanCurrently has health insurance
insurance_typestringmedicaid, medicare, employer, marketplace, none
primary_care_providerstringHas a primary care doctor (yes/no)
disabilitiesstring[]Self-reported disabilities or conditions

Education

FieldTypeDescription
highest_educationstringnone, ged, high_school, some_college, associates, bachelors, masters, doctorate
currently_enrolledbooleanCurrently enrolled in education/training
school_namestringCurrent school or training program

Transportation

FieldTypeDescription
has_vehiclebooleanHas access to a personal vehicle
has_licensebooleanHas a valid driver license
primary_transportstringcar, bus, ride_share, bike, walk

Emergency

FieldTypeDescription
emergency_contact_namestringEmergency contact full name
emergency_contact_phonestringEmergency contact phone number
emergency_contact_relationstringRelationship to member

Webhooks

Register webhook URLs to receive real-time notifications when events occur. All webhook payloads are signed so you can verify authenticity.

Available Events
referral.newreferral.updatedsubmission.newsubmission.reviewedmember.consented
Example Payload
{
  "event": "referral.new",
  "timestamp": "2026-03-31T10:00:00Z",
  "data": {
    "referral_id": "ref_xyz789",
    "member_name": "Marcus Johnson",
    "category": "housing",
    "status": "sent"
  }
}
Signature Verification

Every webhook request includes an X-URPower-Signature header containing an HMAC-SHA256 hash of the request body using your webhook secret. Verify this signature before processing the payload.

const crypto = require('crypto');

function verifySignature(body, signature, secret) {
  const expected = crypto
    .createHmac('sha256', secret)
    .update(body)
    .digest('hex');
  return crypto.timingSafeEqual(
    Buffer.from(signature),
    Buffer.from(expected)
  );
}

Rate Limits

1,000
Requests per hour
429
Status when exceeded
Per Key
Limits are per API key

When you exceed the rate limit, the API returns a 429 Too Many Requests response. Check the Retry-After header for the number of seconds to wait before making another request.

Rate Limit Response
HTTP/1.1 429 Too Many Requests
Retry-After: 120
Content-Type: application/json

{
  "error": "rate_limit_exceeded",
  "message": "Too many requests. Please wait before retrying.",
  "retry_after": 120
}

Rate limit headers are included on every response:

X-RateLimit-Limit--Maximum requests per hour (1000)
X-RateLimit-Remaining--Requests remaining in current window
X-RateLimit-Reset--Unix timestamp when the window resets

Error Codes

CodeMeaning
400Bad Request -- Invalid parameters or request body
401Unauthorized -- Missing or invalid API key
403Forbidden -- API key lacks the required scope
404Not Found -- Resource does not exist or does not belong to your organization
409Conflict -- Invalid state transition (e.g., completing a declined referral)
422Unprocessable -- Request body is valid JSON but semantically incorrect
429Rate Limit -- Too many requests, check Retry-After header
500Server Error -- Something went wrong on our end