Ohio Foreclosure Data API

Programmatic access to Ikonen's Ohio foreclosure data feed — real-time auction cases across all 88 counties. All endpoints return JSON and follow REST conventions.

Overview

The Ikonen API provides read access to enriched foreclosure auction case data across select Ohio counties, updated continuously throughout the business day. The API is REST-based — all responses are JSON.

API keys are available to all registered users via your account dashboard. Unsubscribed accounts have access to the /preview endpoint only (5 lowest-equity deals). Full access to all endpoints requires an active Standard subscription.

Base URL

https://slnixzltaelyhckbhmht.supabase.co/functions/v1/gateway

All endpoints below are relative to this base URL.

Authentication

Every request must include your API key as a Bearer token in the Authorization header:

Authorization: Bearer YOUR_API_KEY

Generate your key from the dashboard. Keys are prefixed alpi_. The raw key is shown once on generation — store it securely. Only its hash is retained by Ikonen.

StatusMeaning
401Missing, invalid, or inactive API key.
403Valid key but endpoint requires an active Standard subscription.

Endpoints

GET /preview

Test the service with a sample of the production dataset. Available to all API key holders regardless of subscription status. Use this to evaluate data quality before subscribing.

Auth required: API key  |  Subscription required: No

GET /cases

Returns a paginated list of enriched foreclosure cases. Supports filtering by county, date, and status. Results are ordered by auction_date descending by default.

Auth required: API key  |  Subscription required: Yes (Standard)

GET /cases/:id

Returns a single case record by its numeric ID.

Auth required: API key  |  Subscription required: Yes (Standard)

GET /counties

Returns a summary of all counties in the dataset, with the earliest and latest auction dates seen for each. Useful for building filter UIs or discovery.

Auth required: API key  |  Subscription required: Yes (Standard)

GET /usage

Returns your current plan and call count for the current calendar month.

Auth required: API key  |  Subscription required: No

Query parameters — /cases

All filters are exact-match. Combine multiple parameters with AND logic.

Parameter Type Description Example
county string Exact county name (lowercase, e.g. hamilton, butler). ?county=hamilton
auction_date date Exact auction date in YYYY-MM-DD format. ?auction_date=2026-04-02
auction_status string Auction lifecycle status. Known values: Scheduled, Sold, Cancelled, Postponed. ?auction_status=Scheduled
case_status string Court case procedural status. Known values: New Case, Active, Closed. ?case_status=New+Case
page integer Page number. Default: 1. ?page=2
page_size integer Records per page. Default: 50. Maximum: 100. ?page_size=100

Response format

All responses follow a consistent envelope:

{ "data": [ ... ], "meta": { "count": 50, "page": 1, "page_size": 50, "total": 847, "total_pages": 17 }, "error": null }

On error, data and meta are null and error contains a message string.

Case object

{ "id": 1, "case_number": "A250288311499", "county": "hamilton", "defendant_name": "JENNIFER ROLLINGER", "auction_date": "2026-03-25", "date_of_sale": null, "sale_amount": null, "address": "3389 GLENMORE AVE", "city": "CINCINNATI", "state": "OH", "zip": "45211", "case_type": "Surplus", "case_status": "New Case", "auction_status": "Scheduled", "foreclosure_type": "Mortgage", "sale_type": "NON-TAX SALE", "source": "auction_scraper", "scraped_at": "2026-03-07T14:32:11Z", "updated_at": "2026-03-07T14:32:11Z", "enriched_at": "2026-03-07T14:34:58Z", "arv": 218000.00, "estimated_loan_balance": 110000.00, "estimated_equity": 108000.00, "estimated_surplus": null, "phone_numbers": ["+15134820000"], "emails": ["jennifer.rollinger@example.com"], "enrichment_errors": null }

batchdata_property_raw and batchdata_skiptrace_raw are omitted from responses for non-subscribed accounts. See the Data Catalog for full field descriptions.

Pagination

Use page and page_size to walk through large result sets. The meta block always tells you the total record count and total pages.

# First page of Hamilton County cases, 100 per page GET /cases?county=hamilton&page=1&page_size=100 # Second page GET /cases?county=hamilton&page=2&page_size=100

Rate limits

Limits are enforced per API key. Response headers report your current window state.

Account typeRequests / minuteMonthly cap
Unsubscribed (preview only)30None
Standard300None

Rate limit headers returned on every response:

X-RateLimit-Limit: 300 X-RateLimit-Remaining: 299 X-RateLimit-Reset: 1774632492

Exceeding the limit returns 429 Too Many Requests with a Retry-After header.

Example requests

Preview — no subscription needed

curl -s -H "Authorization: Bearer YOUR_API_KEY" \ "https://slnixzltaelyhckbhmht.supabase.co/functions/v1/gateway/preview"

All scheduled cases in Hamilton County

curl -s -H "Authorization: Bearer YOUR_API_KEY" \ "https://slnixzltaelyhckbhmht.supabase.co/functions/v1/gateway/cases?county=hamilton&auction_status=Scheduled&page_size=100"

Cases on a specific auction date

curl -s -H "Authorization: Bearer YOUR_API_KEY" \ "https://slnixzltaelyhckbhmht.supabase.co/functions/v1/gateway/cases?auction_date=2026-04-02"

Single case by ID

curl -s -H "Authorization: Bearer YOUR_API_KEY" \ "https://slnixzltaelyhckbhmht.supabase.co/functions/v1/gateway/cases/42"

County summary

curl -s -H "Authorization: Bearer YOUR_API_KEY" \ "https://slnixzltaelyhckbhmht.supabase.co/functions/v1/gateway/counties"

Python

import httpx BASE = "https://slnixzltaelyhckbhmht.supabase.co/functions/v1/gateway" HEADERS = {"Authorization": "Bearer YOUR_API_KEY"} # Fetch all scheduled Hamilton County cases r = httpx.get(f"{BASE}/cases", params={ "county": "hamilton", "auction_status": "Scheduled", "page_size": 100, }, headers=HEADERS) payload = r.json() cases = payload["data"] total = payload["meta"]["total"]

JavaScript (fetch)

const BASE = "https://slnixzltaelyhckbhmht.supabase.co/functions/v1/gateway"; const HEADERS = { Authorization: "Bearer YOUR_API_KEY" }; const params = new URLSearchParams({ county: "hamilton", auction_status: "Scheduled", page_size: "100", }); const res = await fetch(`${BASE}/cases?${params}`, { headers: HEADERS }); const { data: cases, meta } = await res.json();

Error codes

HTTP statusMeaning
401Missing, empty, or invalid API key.
403Endpoint requires an active Standard subscription.
404Case ID not found, or unknown endpoint path.
429Rate limit exceeded. See Retry-After header.
500Server-side error. Contact support if persistent.

Field reference

For complete field descriptions — types, value enumerations, and data quality notes — see the Data Catalog.