eClipping APIopa.eclipping.org ↗
Search Oklahoma Press Association public-notice archives for sheriff's sale notices by county and date. Returns parsed case numbers, property descriptions, and auction dates.
What is the eClipping API?
The OPA eClipping Sheriff's Sales API provides access to newspaper public-notice archives maintained by the Oklahoma Press Association, returning up to 9 structured fields per notice through a single search_sheriff_sales endpoint. Notices are extracted from OCR'd newspaper pages scanned from Oklahoma county publications, with each notice yielding fields such as case_number, auction_date, auction_time, property_description, and property_address. Coverage spans all Oklahoma counties and any publication date range within the archive.
curl -X GET 'https://api.parse.bot/scraper/95ab16dd-9fed-4d3a-8f51-0063fbb0166e/search_sheriff_sales?county=oklahoma&date_from=2026-09-13' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace opa-eclipping-org-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: Oklahoma sheriff-sale public notices — bounded, re-runnable."""
from parse_apis.opa_eclipping_org_api import OpaEclipping, County, InputFormatInvalid
client = OpaEclipping()
# Search recent sheriff-sale notices in Oklahoma County, capped at 10 items.
for notice in client.notices.search(county=County.OKLAHOMA, limit=10):
addr = notice.property_address or "no address listed"
value = f"${notice.appraised_value:,}" if notice.appraised_value else "n/a"
print(f"{notice.case_number} {addr} appraised: {value}")
# Drill into one notice for full text.
hit = client.notices.search(county=County.TULSA, limit=1).first()
if hit is not None:
print(f"\n--- {hit.case_number} ---")
if hit.auction_date:
print(f"Auction: {hit.auction_date} {hit.auction_time or ''}")
print(hit.notice_text[:200])
# Fetch the full report wrapper to inspect newspaper-page metadata.
try:
report = client.sale_reports.search(county=County.OKLAHOMA, page_size=5)
except InputFormatInvalid as e:
print(f"Bad input: {e.message}")
else:
print(f"\nCounty: {report.county} window: {report.date_from} → {report.date_to}")
print(f"Matched {report.total_pages_matched} newspaper pages, showing {len(report.newspaper_pages)}:")
for np in report.newspaper_pages:
print(f" {np.publication} {np.published_date} p.{np.page} — {np.notice_count} notices")
print("\nexercised: notices.search / sale_reports.search")
Searches the Oklahoma Press Association public-notice archive for newspaper pages that contain the phrase "sheriff's sale", restricted to newspapers of one Oklahoma county and a publication date window, then reads each matching page's OCR text and extracts the individual sheriff's sale notices on it. Result grain: `notices` is one row per sheriff's sale notice found (a notice republished on several dates appears once per publication date); `newspaper_pages` lists every newspaper page in the current page of results with the number of notices parsed from it. Pagination is over newspaper pages (`page`/`page_size`, `total_pages_matched`, `has_more`), not over notices, and each newspaper page costs one extra request, so a page_size of 10 is roughly 13 requests. Fields parsed from OCR text are best-effort: `auction_date` (ISO), `auction_time`, `property_description` (legal description), `property_address`, `appraised_value` (whole dollars) and `case_number` may be null when the notice text is garbled or uses an unusual layout; `notice_text` carries the raw notice text (truncated at 6000 characters) for callers who need to parse further. Omitting the dates searches the last 30 days ending today. The archive only covers roughly the last twelve months. A county/date window with no matching pages returns an empty result with total_pages_matched 0.
| Param | Type | Description |
|---|---|---|
| page | integer | 1-based page of matching newspaper pages. |
| countyrequired | string | Oklahoma county name as shown in the site's county filter (case-insensitive). Only newspapers assigned to this county are searched. |
| date_to | string | Latest publication date to search, ISO date YYYY-MM-DD; must not be before date_from. Omitted = today. |
| date_from | string | Earliest publication date to search, ISO date YYYY-MM-DD. Omitted = 30 days before today. |
| page_size | integer | Newspaper pages per call, clamped to a maximum of 20. |
{
"type": "object",
"fields": {
"page": "current page number of newspaper pages",
"county": "echo of the county searched, title-cased",
"date_to": "ISO end of the searched publication window",
"notices": "array of parsed sheriff's sale notices: case_number, auction_date (ISO), auction_time, property_description, property_address, appraised_value (whole USD, nullable), notice_text, page_id, publication, published_date, page",
"has_more": "true when a later page of newspaper pages exists",
"date_from": "ISO start of the searched publication window",
"page_size": "newspaper pages per call after clamping",
"failed_pages": "array of {page_id, status_code} for newspaper pages whose text could not be fetched",
"newspaper_pages": "array of newspaper pages in this result page: page_id, publication, published_date (ISO), page (printed page label), notice_count",
"total_pages_matched": "total newspaper pages matching the search across all pages (from the site)"
},
"sample": {
"data": {
"page": 1,
"county": "Beckham",
"date_to": "2026-10-12",
"notices": [
{
"page": "A006",
"page_id": "171401797",
"case_number": "CJ-2025-130",
"notice_text": "NOTICE OF SALE OF LAND UNDER EXECUTION THIS IS AN ATTEMPT TO COLLECT A DEBT AND ANY INFORMATION OBTAINED WILL BE USED FOR THAT PURPOSE Notice is hereby given that on the 3rd day of November 2026 at 10 00 A M location at Courthouse or Room Lobby of the Beckham County Courthouse in Sayre Oklahoma the undersigned Sheriff will offer for sale ...",
"publication": "Beckham County Record (Sayre)",
"auction_date": "2026-11-03",
"auction_time": "10:00 AM",
"published_date": "2026-10-10",
"appraised_value": 70000,
"property_address": "120 South Broadway Street Sayre OK 73662",
"property_description": "Lots 17 and 18 in Block 66 of THE ORIGINAL TOWN OF SAYRE Beckham County Oklahoma commonly known as 120 South Broadway Street Sayre OK 73662"
}
],
"has_more": true,
"date_from": "2026-09-20",
"page_size": 5,
"failed_pages": [],
"newspaper_pages": [
{
"page": "A006",
"page_id": "171401797",
"publication": "Beckham County Record (Sayre)",
"notice_count": 4,
"published_date": "2026-10-10"
},
{
"page": "A007",
"page_id": "171401798",
"publication": "Beckham County Record (Sayre)",
"notice_count": 1,
"published_date": "2026-10-10"
}
],
"total_pages_matched": 6
},
"status": "success"
}
}About the eClipping API
What the API Returns
The search_sheriff_sales endpoint searches the Oklahoma Press Association's public-notice archive for newspaper pages that contain sheriff's sale notices, filtered by county and publication date. Each call returns a notices array where every element includes case_number, auction_date (ISO format), auction_time, property_description, and property_address. The response also surfaces the underlying newspaper_pages array, which records the page_id, publication name, published_date, printed page label, and notice_count for each matched newspaper page.
Filtering and Pagination
The county parameter is required and accepts any Oklahoma county name as it appears in the site's county filter — matching is case-insensitive. Date range is controlled by date_from and date_to (both ISO YYYY-MM-DD), defaulting to the last 30 days when omitted. Results are paginated across newspaper pages using the page and page_size parameters; page_size is clamped to a maximum of 20 newspaper pages per call. The has_more boolean and total_pages_matched field let callers determine whether additional pages exist.
Error Handling and Transparency
When the text of a matched newspaper page cannot be retrieved, that page's page_id and status_code appear in the failed_pages array rather than silently disappearing from results. This lets downstream code distinguish between a page with zero notices and a page that failed to load. The county, date_from, date_to, and page_size fields in the response echo back the normalized values actually used for the query, making it straightforward to verify what was searched.
The eClipping API is a managed, monitored endpoint for opa.eclipping.org — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when opa.eclipping.org changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official opa.eclipping.org API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Track upcoming sheriff's sale auctions in a specific Oklahoma county by polling
auction_datefields weekly. - Build a statewide property-distress monitor by iterating across all 77 Oklahoma counties and aggregating
property_addressdata. - Alert real-estate investors when a new
case_numberappears for a target ZIP code or neighborhood withinproperty_description. - Archive parsed notice data over time by storing
page_idandpublished_datefrom thenewspaper_pagesarray for audit trails. - Cross-reference
case_numbervalues against county court records to enrich notice data with plaintiff and defendant details. - Validate publication compliance by confirming that a required legal notice appeared in a county newspaper within a specific
date_from/date_towindow.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does the Oklahoma Press Association provide an official developer API for this data?+
What exactly is returned in the `notices` array for each sheriff's sale?+
case_number, auction_date (ISO date), auction_time, property_description, property_address, and additional appraised-value or legal-description fields where present in the OCR text. Notices are extracted from the matched newspaper pages; if a page's text could not be fetched, that page appears in failed_pages instead.Can I search notices across multiple counties in a single call?+
county parameter accepts one county per call. To aggregate across multiple counties you would issue one request per county. You can fork this API on Parse and revise it to accept a list of counties and merge results in a single response.Does the API cover other types of public notices beyond sheriff's sales, such as probate notices or foreclosure filings?+
How far back does the archive go, and how current is the data?+
date_from parameter defaults to 30 days before today, and date_to defaults to today, but you can specify any ISO date range. Freshness is tied to when participating newspapers upload pages to the archive, so very recent editions may not appear immediately.