Ryan Malloy 825f0a9224 Add comprehensive documentation and update repository URLs
- Complete README.md with installation, usage, and cost savings examples
- Detailed INSTALLATION.md guide for all deployment scenarios
- Comprehensive USAGE.md with CLI and API examples
- Complete API.md reference for all endpoints
- Update pyproject.toml with correct git.supported.systems URLs
- Highlight 70-90% cost savings throughout documentation
- Professional documentation structure with cross-references
2025-09-09 17:45:20 -06:00

893 lines
20 KiB
Markdown

# API Reference
Complete reference documentation for all RentCache API endpoints, including Rentcast proxy endpoints and system management endpoints.
## 📋 Overview
RentCache provides two types of endpoints:
1. **Proxy Endpoints** (`/api/v1/*`) - Mirror Rentcast API endpoints with intelligent caching
2. **System Endpoints** - Health checks, metrics, and administration
All endpoints support JSON responses and include cache performance headers.
## 🔐 Authentication
All API endpoints require Bearer token authentication using your Rentcast API key:
```http
Authorization: Bearer YOUR_RENTCAST_API_KEY
```
**Example**:
```bash
curl -H "Authorization: Bearer sk_live_1234567890abcdef" \
"http://localhost:8000/api/v1/properties?city=Austin&state=TX"
```
## 📊 Common Response Headers
All responses include performance and cache information:
| Header | Description | Example |
|--------|-------------|---------|
| `X-Cache-Hit` | Whether response was served from cache | `true` or `false` |
| `X-Response-Time-MS` | Total response time in milliseconds | `45.2` |
| `X-Estimated-Cost` | Estimated Rentcast API cost (cache misses only) | `2.0` |
## 🏠 Property Endpoints
### Search Properties
Search for property records using various criteria.
**Endpoint**: `GET /api/v1/properties`
**Cache TTL**: 24 hours
**Estimated Cost**: $1.00 per request
**Rate Limit**: 60/minute
#### Parameters
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `address` | string | No | Full or partial address |
| `zipCode` | string | No | ZIP/postal code |
| `city` | string | No | City name |
| `state` | string | No | State abbreviation (e.g., "TX") |
| `propertyType` | string | No | Property type filter |
| `bedrooms` | integer | No | Number of bedrooms |
| `bathrooms` | number | No | Number of bathrooms (supports decimals) |
| `squareFootage` | integer | No | Square footage |
| `offset` | integer | No | Pagination offset (default: 0) |
| `limit` | integer | No | Results per page (default: 100, max: 500) |
| `force_refresh` | boolean | No | Force cache refresh (default: false) |
| `ttl_override` | integer | No | Override cache TTL in seconds |
#### Example Request
```bash
curl -H "Authorization: Bearer YOUR_API_KEY" \
"http://localhost:8000/api/v1/properties?city=Austin&state=TX&propertyType=Single%20Family&bedrooms=3&limit=10"
```
#### Example Response
```json
{
"status": "success",
"data": [
{
"id": "12345",
"address": "123 Main St",
"city": "Austin",
"state": "TX",
"zipCode": "78701",
"propertyType": "Single Family",
"bedrooms": 3,
"bathrooms": 2,
"squareFootage": 1800,
"lotSize": 0.25,
"yearBuilt": 1995,
"lastSalePrice": 450000,
"lastSaleDate": "2023-06-15",
"estimatedValue": 485000,
"latitude": 30.2672,
"longitude": -97.7431
}
],
"pagination": {
"offset": 0,
"limit": 10,
"total": 1,
"hasMore": false
}
}
```
### Get Property by ID
Retrieve detailed information for a specific property.
**Endpoint**: `GET /api/v1/properties/{property_id}`
**Cache TTL**: 24 hours
**Estimated Cost**: $1.00 per request
**Rate Limit**: 60/minute
#### Parameters
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `property_id` | string | Yes | Unique property identifier |
| `force_refresh` | boolean | No | Force cache refresh |
| `ttl_override` | integer | No | Override cache TTL in seconds |
#### Example Request
```bash
curl -H "Authorization: Bearer YOUR_API_KEY" \
"http://localhost:8000/api/v1/properties/12345"
```
#### Example Response
```json
{
"status": "success",
"data": {
"id": "12345",
"address": "123 Main St",
"city": "Austin",
"state": "TX",
"zipCode": "78701",
"propertyType": "Single Family",
"bedrooms": 3,
"bathrooms": 2,
"squareFootage": 1800,
"lotSize": 0.25,
"yearBuilt": 1995,
"assessedValue": 475000,
"marketValue": 485000,
"propertyHistory": [
{
"date": "2023-06-15",
"price": 450000,
"type": "sale"
}
],
"neighborhood": {
"name": "Downtown Austin",
"walkScore": 85,
"crimeScore": "Low"
}
}
}
```
## 💰 Value Estimation Endpoints
### Get Property Value Estimate
Get an estimated market value for a property.
**Endpoint**: `GET /api/v1/estimates/value`
**Cache TTL**: 1 hour
**Estimated Cost**: $2.00 per request
**Rate Limit**: 30/minute
#### Parameters
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `address` | string | No | Property address |
| `zipCode` | string | No | ZIP code |
| `city` | string | No | City name |
| `state` | string | No | State abbreviation |
| `propertyType` | string | No | Property type |
| `bedrooms` | integer | No | Number of bedrooms |
| `bathrooms` | number | No | Number of bathrooms |
| `squareFootage` | integer | No | Square footage |
| `force_refresh` | boolean | No | Force cache refresh |
| `ttl_override` | integer | No | Override cache TTL |
#### Example Request
```bash
curl -H "Authorization: Bearer YOUR_API_KEY" \
"http://localhost:8000/api/v1/estimates/value?address=123%20Main%20St&city=Austin&state=TX"
```
#### Example Response
```json
{
"status": "success",
"data": {
"address": "123 Main St, Austin, TX 78701",
"estimatedValue": 485000,
"confidence": 85,
"valuationRange": {
"low": 460000,
"high": 510000
},
"comparables": [
{
"address": "125 Main St",
"salePrice": 475000,
"saleDate": "2023-08-12",
"distance": 0.1
}
],
"marketTrends": {
"monthlyChange": 2.1,
"yearlyChange": 8.5
},
"lastUpdated": "2024-01-15T10:30:00Z"
}
}
```
### Bulk Value Estimates
Get value estimates for multiple properties in a single request.
**Endpoint**: `POST /api/v1/estimates/value/bulk`
**Cache TTL**: 1 hour
**Estimated Cost**: $10.00 per request
**Rate Limit**: 10/minute
#### Request Body
```json
{
"properties": [
{
"address": "123 Main St",
"city": "Austin",
"state": "TX"
},
{
"address": "456 Oak Ave",
"city": "Austin",
"state": "TX"
}
],
"force_refresh": false,
"ttl_override": 7200
}
```
#### Example Request
```bash
curl -X POST \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"properties": [
{"address": "123 Main St", "city": "Austin", "state": "TX"},
{"address": "456 Oak Ave", "city": "Austin", "state": "TX"}
]
}' \
"http://localhost:8000/api/v1/estimates/value/bulk"
```
## 🏠 Rent Estimation Endpoints
### Get Rent Estimate
Get an estimated rental value for a property.
**Endpoint**: `GET /api/v1/estimates/rent`
**Cache TTL**: 1 hour
**Estimated Cost**: $2.00 per request
**Rate Limit**: 30/minute
#### Parameters
Same as value estimation endpoint.
#### Example Request
```bash
curl -H "Authorization: Bearer YOUR_API_KEY" \
"http://localhost:8000/api/v1/estimates/rent?address=123%20Main%20St&city=Austin&state=TX"
```
#### Example Response
```json
{
"status": "success",
"data": {
"address": "123 Main St, Austin, TX 78701",
"estimatedRent": 2450,
"confidence": 82,
"rentRange": {
"low": 2200,
"high": 2700
},
"comparables": [
{
"address": "125 Main St",
"rent": 2400,
"bedrooms": 3,
"bathrooms": 2,
"distance": 0.1
}
],
"marketMetrics": {
"averageRent": 2380,
"rentPerSqFt": 1.36,
"occupancyRate": 94.2
},
"lastUpdated": "2024-01-15T10:30:00Z"
}
}
```
### Bulk Rent Estimates
Get rent estimates for multiple properties.
**Endpoint**: `POST /api/v1/estimates/rent/bulk`
**Cache TTL**: 1 hour
**Estimated Cost**: $10.00 per request
**Rate Limit**: 10/minute
Similar to bulk value estimates but returns rental estimates.
## 🏘️ Listings Endpoints
### Search Sale Listings
Search for properties currently for sale.
**Endpoint**: `GET /api/v1/listings/sale`
**Cache TTL**: 30 minutes
**Estimated Cost**: $0.50 per request
**Rate Limit**: 60/minute
#### Parameters
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `address` | string | No | Address filter |
| `zipCode` | string | No | ZIP code filter |
| `city` | string | No | City filter |
| `state` | string | No | State filter |
| `propertyType` | string | No | Property type filter |
| `bedrooms` | integer | No | Bedroom count filter |
| `bathrooms` | number | No | Bathroom count filter |
| `minPrice` | integer | No | Minimum listing price |
| `maxPrice` | integer | No | Maximum listing price |
| `offset` | integer | No | Pagination offset |
| `limit` | integer | No | Results per page |
#### Example Request
```bash
curl -H "Authorization: Bearer YOUR_API_KEY" \
"http://localhost:8000/api/v1/listings/sale?city=Austin&state=TX&bedrooms=3&minPrice=300000&maxPrice=600000"
```
#### Example Response
```json
{
"status": "success",
"data": [
{
"id": "listing_123",
"address": "123 Main St",
"city": "Austin",
"state": "TX",
"zipCode": "78701",
"price": 485000,
"bedrooms": 3,
"bathrooms": 2,
"squareFootage": 1800,
"lotSize": 0.25,
"propertyType": "Single Family",
"listingDate": "2024-01-10",
"daysOnMarket": 5,
"status": "Active",
"mls": "12345678",
"photos": [
"https://example.com/photo1.jpg"
],
"description": "Beautiful home in downtown Austin..."
}
],
"pagination": {
"offset": 0,
"limit": 10,
"total": 1,
"hasMore": false
}
}
```
### Search Rental Listings
Search for rental properties.
**Endpoint**: `GET /api/v1/listings/rental`
**Cache TTL**: 30 minutes
**Estimated Cost**: $0.50 per request
**Rate Limit**: 60/minute
#### Parameters
Similar to sale listings, but with `minRent`/`maxRent` instead of price filters.
#### Example Response
```json
{
"status": "success",
"data": [
{
"id": "rental_456",
"address": "456 Oak Ave",
"city": "Austin",
"state": "TX",
"rent": 2400,
"bedrooms": 2,
"bathrooms": 2,
"squareFootage": 1200,
"propertyType": "Apartment",
"availableDate": "2024-02-01",
"leaseTerms": "12 months",
"petPolicy": "Cats allowed",
"amenities": ["Pool", "Gym", "Parking"],
"photos": ["https://example.com/rental1.jpg"]
}
]
}
```
### Get Listing by ID
Get detailed information for a specific listing.
**Endpoint**: `GET /api/v1/listings/{listing_id}`
**Cache TTL**: 1 hour
**Estimated Cost**: $0.50 per request
**Rate Limit**: 60/minute
#### Example Request
```bash
curl -H "Authorization: Bearer YOUR_API_KEY" \
"http://localhost:8000/api/v1/listings/listing_123"
```
## 📈 Market Data Endpoints
### Market Statistics
Get comprehensive market statistics for an area.
**Endpoint**: `GET /api/v1/markets/stats`
**Cache TTL**: 2 hours
**Estimated Cost**: $5.00 per request
**Rate Limit**: 20/minute
#### Parameters
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `zipCode` | string | No | ZIP code for market area |
| `city` | string | No | City name |
| `state` | string | No | State abbreviation |
| `force_refresh` | boolean | No | Force cache refresh |
| `ttl_override` | integer | No | Override cache TTL |
#### Example Request
```bash
curl -H "Authorization: Bearer YOUR_API_KEY" \
"http://localhost:8000/api/v1/markets/stats?zipCode=78701"
```
#### Example Response
```json
{
"status": "success",
"data": {
"location": {
"zipCode": "78701",
"city": "Austin",
"state": "TX"
},
"salesMetrics": {
"medianSalePrice": 485000,
"averageSalePrice": 512000,
"totalSales": 156,
"daysOnMarket": 28,
"pricePerSqFt": 275,
"monthlyChange": 2.1,
"yearlyChange": 8.5
},
"rentalMetrics": {
"medianRent": 2400,
"averageRent": 2450,
"totalRentals": 89,
"vacancyRate": 5.8,
"rentPerSqFt": 1.36,
"monthlyChange": 1.2,
"yearlyChange": 12.3
},
"marketTrends": {
"inventoryLevel": "Low",
"marketTempo": "Fast",
"buyerDemand": "High",
"priceDirection": "Rising"
},
"demographics": {
"medianHouseholdIncome": 65000,
"population": 15420,
"medianAge": 32
},
"lastUpdated": "2024-01-15T10:30:00Z"
}
}
```
### Comparable Properties
Find comparable properties for analysis.
**Endpoint**: `GET /api/v1/comparables`
**Cache TTL**: 1 hour
**Estimated Cost**: $3.00 per request
**Rate Limit**: 30/minute
#### Parameters
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `address` | string | No | Subject property address |
| `zipCode` | string | No | ZIP code |
| `city` | string | No | City name |
| `state` | string | No | State abbreviation |
| `propertyType` | string | No | Property type |
| `bedrooms` | integer | No | Number of bedrooms |
| `bathrooms` | number | No | Number of bathrooms |
| `squareFootage` | integer | No | Square footage |
| `radius` | number | No | Search radius in miles (default: 1.0) |
| `maxComps` | integer | No | Maximum comparables to return (default: 10) |
#### Example Request
```bash
curl -H "Authorization: Bearer YOUR_API_KEY" \
"http://localhost:8000/api/v1/comparables?address=123%20Main%20St&city=Austin&state=TX&radius=0.5"
```
#### Example Response
```json
{
"status": "success",
"data": {
"subjectProperty": {
"address": "123 Main St",
"city": "Austin",
"state": "TX"
},
"comparables": [
{
"address": "125 Main St",
"salePrice": 475000,
"saleDate": "2023-08-12",
"bedrooms": 3,
"bathrooms": 2,
"squareFootage": 1750,
"lotSize": 0.22,
"yearBuilt": 1992,
"distance": 0.1,
"similarity": 95,
"adjustments": {
"location": 0,
"size": 5000,
"age": -2000,
"condition": 0
},
"adjustedPrice": 478000
}
],
"summary": {
"averagePrice": 478000,
"priceRange": {
"low": 460000,
"high": 495000
},
"averagePricePerSqFt": 268,
"confidenceScore": 88
}
}
}
```
## 🛠️ System Endpoints
### Health Check
Check system health and status.
**Endpoint**: `GET /health`
**Authentication**: None required
**Rate Limit**: None
#### Example Request
```bash
curl http://localhost:8000/health
```
#### Example Response
```json
{
"status": "healthy",
"timestamp": "2024-01-15T10:30:00Z",
"version": "1.0.0",
"database": "healthy",
"cache_backend": "sqlite",
"active_keys": 3,
"total_cache_entries": 1234,
"cache_hit_ratio_24h": 0.89
}
```
### System Metrics
Get detailed system performance metrics.
**Endpoint**: `GET /metrics`
**Authentication**: None required
**Rate Limit**: 10/minute
#### Example Request
```bash
curl http://localhost:8000/metrics
```
#### Example Response
```json
{
"total_requests": 2543,
"cache_hits": 2287,
"cache_misses": 256,
"cache_hit_ratio": 0.8992,
"active_api_keys": 3,
"total_cost_saved": 4574.0,
"avg_response_time_ms": 28.5,
"uptime_seconds": 86400,
"requests_24h": 456,
"cache_hits_24h": 405,
"cost_24h": 102.0,
"top_endpoints": [
{
"endpoint": "properties",
"requests": 1205
},
{
"endpoint": "value_estimate",
"requests": 892
},
{
"endpoint": "listings_sale",
"requests": 234
}
]
}
```
## 🔧 Administration Endpoints
### Create API Key
Create a new API key for application access.
**Endpoint**: `POST /admin/api-keys`
**Authentication**: Admin required (implementation-specific)
**Rate Limit**: 5/minute
#### Request Body
```json
{
"key_name": "production_app",
"rentcast_api_key": "sk_live_1234567890abcdef",
"daily_limit": 5000,
"monthly_limit": 100000,
"expires_at": "2024-12-31T23:59:59Z"
}
```
#### Example Request
```bash
curl -X POST \
-H "Content-Type: application/json" \
-d '{
"key_name": "my_app",
"rentcast_api_key": "sk_live_1234567890abcdef",
"daily_limit": 1000,
"monthly_limit": 10000
}' \
"http://localhost:8000/admin/api-keys"
```
#### Example Response
```json
{
"id": 1,
"key_name": "my_app",
"daily_limit": 1000,
"monthly_limit": 10000,
"daily_usage": 0,
"monthly_usage": 0,
"is_active": true,
"expires_at": null,
"created_at": "2024-01-15T10:30:00Z"
}
```
### Clear Cache
Clear cache entries based on criteria.
**Endpoint**: `POST /admin/cache/clear`
**Authentication**: Admin required
**Rate Limit**: 5/minute
#### Request Body
```json
{
"endpoint": "properties",
"older_than_hours": 24,
"invalid_only": false
}
```
#### Example Request
```bash
curl -X POST \
-H "Content-Type: application/json" \
-d '{
"endpoint": "properties",
"older_than_hours": 24
}' \
"http://localhost:8000/admin/cache/clear"
```
#### Example Response
```json
{
"message": "Cleared 156 cache entries",
"pattern": "*properties*"
}
```
## 🚫 Error Responses
All endpoints return consistent error responses:
### HTTP Status Codes
| Code | Meaning | Description |
|------|---------|-------------|
| 200 | OK | Request successful |
| 400 | Bad Request | Invalid parameters |
| 401 | Unauthorized | Missing or invalid API key |
| 403 | Forbidden | API key lacks permissions |
| 404 | Not Found | Resource not found |
| 429 | Too Many Requests | Rate limit exceeded |
| 500 | Internal Server Error | Server error |
| 502 | Bad Gateway | Upstream API error |
| 503 | Service Unavailable | Service temporarily unavailable |
### Error Response Format
```json
{
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Daily API limit of 1000 requests exceeded",
"details": {
"daily_usage": 1001,
"daily_limit": 1000,
"reset_time": "2024-01-16T00:00:00Z"
}
}
}
```
### Common Error Codes
| Code | Description |
|------|-------------|
| `INVALID_API_KEY` | API key not found or inactive |
| `RATE_LIMIT_EXCEEDED` | Request rate limit exceeded |
| `INVALID_PARAMETERS` | Request parameters validation failed |
| `UPSTREAM_API_ERROR` | Error from Rentcast API |
| `CACHE_ERROR` | Cache system error |
| `DATABASE_ERROR` | Database connection error |
## 📊 Response Caching
### Cache Headers
All responses include cache-related headers:
```http
X-Cache-Hit: true
X-Response-Time-MS: 12.5
X-Cache-Age: 3600
X-Cache-TTL: 86400
```
### Cache Key Generation
Cache keys are generated using MD5 hash of:
- HTTP method
- Endpoint name
- Sorted query parameters
- Request body (for POST requests)
Example: `GET:properties:{"city":"Austin","state":"TX"}``a1b2c3d4e5f6...`
### Cache Invalidation
Cache entries can be invalidated:
- Automatically when TTL expires
- Manually via admin endpoints
- Using `force_refresh=true` parameter
- Through CLI commands
## 🔄 Rate Limiting
### Rate Limit Headers
Rate-limited endpoints include headers:
```http
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 45
X-RateLimit-Reset: 1642248000
X-RateLimit-Window: 60
```
### Rate Limit Tiers
| Endpoint Type | Rate Limit | Burst Allowance |
|---------------|------------|-----------------|
| Property Search | 60/minute | 10 requests |
| Value Estimates | 30/minute | 5 requests |
| Market Stats | 20/minute | 3 requests |
| Listings | 60/minute | 10 requests |
| Bulk Operations | 10/minute | 2 requests |
### Rate Limit Bypass
Cache hits do not count against rate limits, providing natural rate limit relief through caching.
---
## 📚 Additional Resources
- **[Installation Guide](INSTALLATION.md)** - Setup and configuration
- **[Usage Guide](USAGE.md)** - Comprehensive usage examples
- **[Rentcast API Documentation](https://developers.rentcast.io/reference/introduction)** - Official API docs
For questions or issues, please refer to the project repository at [git.supported.systems/MCP/rentcache](https://git.supported.systems/MCP/rentcache).